检查数据库 db2 中的约束
Check constraint in database db2
我正在设计一个数据库,其中包括以下实体:
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)
);
现在 Director 和 Movie 有 2 个关系:Direct 和 WonAward。后面是记录导演是否凭借he/she执导的电影获奖或以上:
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
);
我需要确保导演只因 he/she 执导的电影而获奖。现在我已经尝试使用 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
如果没有这些限制,我发现用户可以将导演因非他们导演的电影而获得的奖项输入数据库。我怎样才能做到这一点?
您不能创建查询相关行外数据的检查约束。您可以做的是创建一个 BEFORE TRIGGER 来验证是否满足条件。 CREATE TRIGGER documentation 中有一些示例可以根据您的需要进行定制。
定义一个从WonAward
到Directs
的外键,改为:
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
);
我正在设计一个数据库,其中包括以下实体:
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)
);
现在 Director 和 Movie 有 2 个关系:Direct 和 WonAward。后面是记录导演是否凭借he/she执导的电影获奖或以上:
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
);
我需要确保导演只因 he/she 执导的电影而获奖。现在我已经尝试使用 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
如果没有这些限制,我发现用户可以将导演因非他们导演的电影而获得的奖项输入数据库。我怎样才能做到这一点?
您不能创建查询相关行外数据的检查约束。您可以做的是创建一个 BEFORE TRIGGER 来验证是否满足条件。 CREATE TRIGGER documentation 中有一些示例可以根据您的需要进行定制。
定义一个从WonAward
到Directs
的外键,改为:
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
);