在我的数据库课程中,我们使用了一本书(数据库系统 - 完整书),该书说明以下是标准SQL中的有效create table语句:
CREATE TABLE Participants (
meetid INT NOT NULL,
-- ...
CONSTRAINT RoomConstraint
CHECK (1 >= ALL (SELECT num FROM Numbers)
);
但是DB2抱怨并且为这个陈述失败的原因提供了20种可能的解释。
那么,DB2不支持元组约束中的子查询吗?如果没有,TRIGGER是否是执行子查询约束的唯一解决方案?
更新:我发现此链接指出不可能:http://bytes.com/topic/db2/answers/837390-can-constraint-replace-trigger
但又一次,TRIGGER是唯一的出路吗? (我正在尝试强制执行一个属性可以引用两个不同的表(它不是我的数据库)的关系。)
更新2:如果没有ALL
,它就无效:
CREATE TABLE Foo (
meetid INT NOT NULL,
CHECK (meetid IN (SELECT meetid FROM Foo)));
更新3:我的想法是我想要一个引用两个表的外键,如下所示:
Table Participants (pid, ...)
Table Rooms (room, ...)
Table People (userid, ...)
基本上,pid应存在于Rooms(属性房间)或People(属性userid)中。我可以使用行约束来检查pid是在Rooms还是在People中 - 但DB2不会让我这样做。 (我知道有很多其他东西要限制模仿外键)
答案 0 :(得分:1)
如何在SQL Server中实现可选(或备用)外键检查约束
create function dbo.meetidinmeetings(@meetid)
returns bit
as
begin
declare @return bit
as
if exists(select 1 from meetings where meetid = @meetid)
set @return =1
else
set @return = 0
return @return
end
...然后
CREATE TABLE Foo (
meetid INT NOT NULL,
ismeeting bit NOT NULL DEFAULT 0
ALTER TABLE FOO
ADD CONSTRAINT CHK_FOO_MEETID
CHECK ((ismeeting = 0) or (ismeeting = 1 and dbo.is_meetidinmeetings(meetid) = 1)))
答案 1 :(得分:0)
ALL()不是标准SQL ** - 它是T-SQL扩展。 DB2不支持这一点。
我不确定您要对约束做什么 - 看起来您正在尝试确保Numbers表中num的每个值都小于或等于1.如果这实际上是例如,您应该在Numbers表上添加约束,而不是在Participants上添加约束。
** SQL92标准,我不相信它被添加到SQL99或SQL2003