Создать оператор не работает с четырьмя ограничениями, но работает с двумя? - PullRequest
1 голос
/ 06 февраля 2012

Я пытаюсь отладить проблему с помощью оператора 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 ]

12 голосов
/ 06 февраля 2012

В операторе CREATE TABLE перед каждым CONSTRAINT.

пропущена запятая.
2 голосов
/ 06 февраля 2012

При создании таблицы есть два способа выполнения ограничений. На уровне таблицы или на уровне столбца. Например (с использованием 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...