代码之家  ›  专栏  ›  技术社区  ›  Lasse Espeholt

元组约束DB2中的子查询

  •  0
  • Lasse Espeholt  · 技术社区  · 14 年前

    在我的数据库课程中,我们使用了一本书(database System-the Complete book),书中说以下是标准SQL中有效的create table语句:

    CREATE TABLE Participants (
        meetid INT NOT NULL,
        -- ...
        CONSTRAINT RoomConstraint
            CHECK (1 >= ALL (SELECT num FROM Numbers)
    );
    

    但是DB2抱怨并给出了20种可能的解释来解释为什么这个语句失败。

    更新: 我找到了这个链接,上面说不可能: http://bytes.com/topic/db2/answers/837390-can-constraint-replace-trigger

    ALL 或者:

    CREATE TABLE Foo (
       meetid INT NOT NULL,
       CHECK (meetid IN (SELECT meetid FROM Foo)));
    

    Table Participants (pid, ...)
    Table Rooms (room, ...)
    Table People (userid, ...)
    

    基本上,pid应该存在于room(属性room)或People(属性userid)中。我可以用一个行约束来检查pid是在房间里还是在人里面,但是DB2不允许我这样做。(我知道模仿外键还有很多其他东西需要约束)

    2 回复  |  直到 14 年前
        1
  •  0
  •   Ian Bjorhovde    14 年前

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

    我不确定您要用约束做什么—看起来您要确保Numbers表中num的每个值都小于或等于1。如果确实是这样,那么应该在Numbers表上添加约束,而不是在Participants上。

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

        2
  •  1
  •   Fred10538    14 年前

    如何在SQLServer中实现可选(或备用)外键检查约束

    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)))