子查询中的元组约束DB2

问题描述:

在我的数据库过程中,我们用书(数据库系统 - 整本书),它说,下面是标准的SQL有效create table语句:子查询中的元组约束DB2

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

但同样是一个触发器的唯一出路? (我试图执行一个关系,其中一个属性可以参考两个不同的表(它不是我的数据库))

更新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不得以任何滚装存在oms(属性室)或People(属性用户标识)中。我可以使用行约束来检查pid是否在Rooms或People中 - 但DB2不会让我。 (我知道有很多其他东西来限制模拟外键)

+0

请发布真正的DDL。您的更新#2显示了一个表格,您希望在插入它之前检查meetid是否已存在于同一个表格中?你如何插入第一行? ;-) – 2010-09-09 20:22:02

+0

INTEGRITY OFF :)我只是想知道当我必须使用子查询时是否有一个很好的替代行约束。真正的例子是漫长而愚蠢的(一个设计错误的数据库),所以我认为最好不要发表。但我会更详细地解释我想要的内容(请参阅2秒内的更新3) – 2010-09-09 20:44:39

ALL()不是标准SQL ** - 它是一个T-SQL扩展。 DB2不支持这一点。

我不确定你想用你的约束来做什么 - 它看起来像你试图确保Numbers表中的每个num值小于或等于1.如果这实际上是在这种情况下,您应该在Numbers表上添加约束条件,而不是在参与者上添加约束条件。

** SQL92标准,我不相信它被添加到SQL99或SQL2003

+0

请参阅更新2.约束只是假人。 – 2010-09-08 15:33:02

如何实现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)))