子查询中的元组约束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不会让我。 (我知道有很多其他东西来限制模拟外键)
ALL()不是标准SQL ** - 它是一个T-SQL扩展。 DB2不支持这一点。
我不确定你想用你的约束来做什么 - 它看起来像你试图确保Numbers表中的每个num值小于或等于1.如果这实际上是在这种情况下,您应该在Numbers表上添加约束条件,而不是在参与者上添加约束条件。
** SQL92标准,我不相信它被添加到SQL99或SQL2003
请参阅更新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)))
请发布真正的DDL。您的更新#2显示了一个表格,您希望在插入它之前检查meetid是否已存在于同一个表格中?你如何插入第一行? ;-) – 2010-09-09 20:22:02
INTEGRITY OFF :)我只是想知道当我必须使用子查询时是否有一个很好的替代行约束。真正的例子是漫长而愚蠢的(一个设计错误的数据库),所以我认为最好不要发表。但我会更详细地解释我想要的内容(请参阅2秒内的更新3) – 2010-09-09 20:44:39