Sql 由外键控制的值
我在SQL Server中有一个非常简单的数据库,包括以下三个表:Sql 由外键控制的值,sql,sql-server,database,foreign-keys,Sql,Sql Server,Database,Foreign Keys,我在SQL Server中有一个非常简单的数据库,包括以下三个表: 剧院(ID,is3D,其他值…) Show(ID,剧院ID,电影ID,日期,时间,其他值…) Movie(ID,is3D,othervalue…) 我想确保3D电影只能在3D影院播放。仅在2D影院播放2D电影,并且仅通过外键(无触发器等)执行此操作。要仅通过外键执行此操作,您还需要在Show中添加一个is3D列以及两个逻辑冗余的唯一约束 CREATE TABLE Theater ( ID INT PRIMA
(剧院
其他值…)ID,is3D,
(Show
其他值…)ID,剧院ID,电影ID,日期,时间,
(Movie
othervalue…)ID,is3D,
我想确保3D电影只能在3D影院播放。仅在2D影院播放2D电影,并且仅通过外键(无触发器等)执行此操作。要仅通过外键执行此操作,您还需要在
Show
中添加一个is3D
列以及两个逻辑冗余的唯一约束
CREATE TABLE Theater
(
ID INT PRIMARY KEY,
is3D BIT NOT NULL,
/*Other columns*/
UNIQUE(ID, is3D)
)
CREATE TABLE Movie
(
ID INT PRIMARY KEY,
is3D BIT NOT NULL,
/*Other columns*/
UNIQUE(ID, is3D)
)
CREATE TABLE Show
(
ID INT PRIMARY KEY,
Theater_ID INT NOT NULL,
Movie_ID INT NOT NULL,
is3D BIT NOT NULL,
/*Other columns*/
FOREIGN KEY(Theater_ID, is3D) REFERENCES Theater (ID, is3D),
FOREIGN KEY(Movie_ID, is3D) REFERENCES Movie (ID, is3D)
)
索引视图也可用于以声明方式强制执行此操作,而无需附加列或唯一约束,如下所示
CREATE TABLE dbo.TwoRows
(
X INT PRIMARY KEY
);
INSERT INTO dbo.TwoRows
VALUES (1), (2)
GO
CREATE VIEW V
WITH SCHEMABINDING
AS
SELECT S.Theater_ID,
S.Movie_ID
FROM dbo.Show S
JOIN dbo.Theater T
ON S.Theater_ID = T.ID
JOIN dbo.Movie M
ON S.Movie_ID = M.ID
CROSS JOIN dbo.TwoRows
WHERE T.is3D <> M.is3D
GO
CREATE UNIQUE CLUSTERED INDEX IX
ON V(Theater_ID, Movie_ID)
创建表dbo.tworrows
(
X INT主键
);
插入到dbo.tworrows中
值(1)、(2)
去
创建视图V
诡计多端
作为
选择S.U.ID,
美国电影公司
来自dbo.Show S
加入dbo剧院T
在S.Theater_ID=T.ID上
加入dbo.M
关于S.Movie_ID=M.ID
交叉连接dbo.tworrows
其中T.is3D M.is3D
去
创建唯一的聚集索引IX
ON V(剧院ID、电影ID)
如果满足规则,则基础查询应始终不返回任何行。如果返回任何一行,则dbo.tworrows
上的交叉连接将使其相乘,从而导致唯一的约束冲突并防止出现这种情况。谢谢!那正是我想要的!