Create语句不适用于四个约束,但可以使用两个约束吗?

时间:2012-02-05 23:53:47

标签: sql sql-server sql-server-2008 tsql database-design

我正在尝试使用create语句调试问题但是我的错误信息确实没有任何意义。

脚本是:

CREATE TABLE    marlin.SupportLog
(
    IssueID             INTEGER         UNIQUE NOT NULL,
    TypeID              INTEGER         NOT NULL ,
    IssueDescription    VARCHAR(5000)   NOT NULL ,
    MinutesSpent        INTEGER         NOT NULL ,
    PriorityID          INTEGER         NOT NULL ,
    UserID              INTEGER         NOT NULL ,
    SubmittedDate       DATETIME        NOT NULL    DEFAULT SYSDATETIME() ,
    LastModifiedDate    DATETIME        NULL        DEFAULT SYSDATETIME() ,
    LastModifiedUserID  INTEGER         NULL

    CONSTRAINT  SupportLog_pk
        PRIMARY KEY NONCLUSTERED (IssueID)

    CONSTRAINT  TypeID_fk
        FOREIGN KEY (TypeID)
            REFERENCES  marlin.SupportIssueType(TypeID)

    CONSTRAINT  SLPriorityID_fk
        FOREIGN KEY (PriorityID)
            REFERENCES  marlin.SupportPriority(PriorityID)

    CONSTRAINT  UserID_fk
        FOREIGN KEY (UserID)
            REFERENCES marlin.SupportUsers(UserID)
);

如果我注释掉最后两个约束,那么该表工作正常,但如果我按上面那样运行它,我会收到:

Msg 8148, Level 16, State 0, Line 1
More than one column FOREIGN KEY constraint specified for column 'LastModifiedUserID', table 'marlin.SupportLog'.
Msg 8148, Level 16, State 0, Line 1
More than one column FOREIGN KEY constraint specified for column 'LastModifiedUserID', table 'marlin.SupportLog'.

错误似乎没有帮助 - 我不理解什么/我做错了什么?

2 个答案:

答案 0 :(得分:12)

CREATE TABLE语句在每个CONSTRAINT之前缺少逗号。

答案 1 :(得分:2)

创建表时,有两种方法可以进行约束。在表级别或列级别。例如(使用Oracle,没有SQL Server方便,但它们都有相同的概念):

-- column level
create table t(c1 number constraint t_uk1 unique
    , c2 number constraint t_uk2 unique);

-- table level
create table t(c1 number
    , c2 number
    , constraint t_uk1 unique(c1)
    , constraint t_uk2 unique(c2));

在您的情况下,没有逗号的情况是,您对表中的最后一列有多个列级限制。我同意这条消息没有帮助。 SQL Server猜测与你的意图有不同的含义。

注意:当涉及多个列时,必须使用表约束。

列级约束中涉及的列是隐式的。据推测,一旦SQL Server通过了一列上的多个外键约束,它就会开始抱怨列的指定方式与指定的位置有所不同。

更多详情可在MSDN找到。