【问题标题】:Check constraint in database db2检查数据库 db2 中的约束
【发布时间】:2015-10-04 01:36:51
【问题描述】:

我正在设计一个包含以下实体的数据库:

create table Director(
    ID integer not null,
    YearsExperience integer not null,
    StudioAffiliation varchar(30),
    NetWorth REAL,
    primary key (ID)
);

create table Movie(
    ID varchar(20) not null,
    Title varchar(40) not null,
    Genre char(1) not null,
    ReleaseDate date not null,
    Earning real not null,
    primary key (ID)
);

现在导演和电影有两种关系:Direct 和 WonAward。后者是记录导演是否因导演的电影获奖或更多:

create table Directs(
    DirectorID integer not null,
    MovieID varchar(20) not null,
    primary key (DirectorID, MovieID),
    foreign key (DirectorID) references Director (ID) on delete cascade,
    foreign key (MovieID) references Movie (ID) on delete cascade
);

create table WonAward(
    DirectorID integer not null,
    MovieID varchar(20) not null,
    AwardName varchar(30) not null,
    Year integer not null,
    Budget REAL not null,
    primary key (DirectorID, MovieID),
    foreign key (DirectorID) references Director (ID) on delete cascade,
    foreign key (MovieID) references Movie (ID) on delete cascade
);

我需要确保导演只因他/她导演的电影而获奖。现在我尝试使用 Check 来实现这一点,但它在 WonAward 关系结束时不断给我以下 2 个条件的错误:

check (DirectorID = (SELECT DirectorID FROM Directs WHERE Directs.MovieID = MovieID)),
 check (MovieID = (SELECT MovieID FROM Directs WHERE Directs.DirectorID = DirectorID))

这是我不断收到的错误:

DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0548N  A check constraint or generated column that is defined with "SELECT" 
is invalid.  SQLSTATE=42621

如果没有这些限制,我发现用户可以将非他们导演的电影的导演奖输入数据库。我怎样才能做到这一点?

【问题讨论】:

    标签: sql database db2 entity constraints


    【解决方案1】:

    您不能创建查询相关行之外的数据的检查约束。您可以做的是创建一个 BEFORE TRIGGER 来验证条件是否满足。 CREATE TRIGGER documentation 中有一些示例可以根据您的需要进行定制。

    【讨论】:

      【解决方案2】:

      定义一个从WonAwardDirects 的外键,而不是:

      create table WonAward(
          DirectorID integer not null,
          MovieID varchar(20) not null,
          AwardName varchar(30) not null,
          Year integer not null,
          Budget REAL not null,
          primary key (DirectorID, MovieID),
          foreign key (DirectorID, MovieID) references Directs
      );
      

      【讨论】:

        猜你喜欢
        • 2017-10-09
        • 1970-01-01
        • 2017-04-29
        • 2013-07-04
        • 1970-01-01
        • 2013-11-11
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多