【问题标题】:Create statement doesn't work with four constraints but works with two?Create 语句不适用于四个约束,但适用于两个?
【发布时间】:2012-02-27 13:56:06
【问题描述】:

我正在尝试使用我的 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'.

这个错误似乎没有帮助 - 我不明白什么/我做错了什么?

【问题讨论】:

  • 错误信息不适合SQL?!奇怪的。您能否发布其他三个表格的 DML,以便我们可以完全复制?
  • @JohnPick 哦,来吧!缺少逗号就是这样。但是这样一个模棱两可的错误信息!如果您可以将此作为答案发布,我会接受,以便您获得相应的声誉。
  • 同意。错误消息具有误导性。

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


【解决方案1】:

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      相关资源
      最近更新 更多