Sql 由外键控制的值

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

我在SQL Server中有一个非常简单的数据库,包括以下三个表:

  • 剧院
    ID,is3D,
    其他值…)
  • Show
    ID,剧院ID,电影ID,日期,时间,
    其他值…)
  • Movie
    ID,is3D,
    othervalue…)

我想确保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
上的交叉连接将使其相乘,从而导致唯一的约束冲突并防止出现这种情况。

谢谢!那正是我想要的!