sql - 由外键控制的值

标签 sql sql-server database foreign-keys

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

  • 剧院(ID,is3D,其他值...)
  • 显示(ID、Theater_ID、Movie_ID、日期、时间其他值...)
  • 电影(ID,is3D,其他值...)

我想确保3D 电影只能在 3D 影院播放。仅在 2D 影院中播放 2D 电影,并且只能通过外键(无触发器等)执行。

最佳答案

要单独通过外键完成此操作,您还需要向 Show 添加一个 is3D 列以及一些逻辑冗余的 UNIQUE 约束.

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)
  ) 

索引 View 也可用于以声明方式强制执行此操作,而无需如下所示的额外列或唯一约束。

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.TwoRows 上的交叉连接会将其相乘,从而导致违反唯一约束并防止出现这种情况。

关于sql - 由外键控制的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16886657/

相关文章:

mysql - PHPMyAdmin放入最新的数据库

mysql - 计数字段、连接、多重选择

c# - Entity Framework 在工作量大的情况下抛出意外异常

C# Visual Studio 数据 GridView 返回 0,其中显示了 SQL 计数

mysql - 查询删除字符串中最后一个逗号后的所有字符

php - pdo 驱动程序不支持 Linux 上的事务

c++ - 如何使用 GDI+ 和 C++ 从 SQL Server 数据库加载和保存图像?

php - 使用高级php上传图片

mysql - 查找具有重复属性值的产品

c# - 定期发送自动电子邮件