元组约束DB2中的子查询

时间:2010-09-08 09:01:33

标签: sql db2 constraints subquery triggers

在我的数据库课程中,我们使用了一本书(数据库系统 - 完整书),该书说明以下是标准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不会让我这样做。 (我知道有很多其他东西要限制模仿外键)

2 个答案:

答案 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