Может ли таблица Microsoft SQL иметь более одного первичного ключа? - PullRequest
3 голосов
/ 24 июня 2010

Мне всегда было любопытно, но я не могу найти краткий ответ. Любая помощь?

Ответы [ 4 ]

9 голосов
/ 24 июня 2010

Он не может иметь более одного первичного ключа .Однако в первичном ключе может быть несколько столбцов.Он также может иметь более одного уникального индекса .Как правило, уникальный индекс является первичным ключом, но можно иметь несколько уникальных индексов в одной таблице.Сверху головы я не могу придумать пример, но когда я это сделаю, я добавлю его.

РЕДАКТИРОВАТЬ : Может быть, это: В США Департамент транспортных средств можеттаблица персон с 2 уникальными столбцами - номер социального страхования и номер водительского удостоверения.Оба должны быть уникальными.

5 голосов
/ 24 июня 2010

Как отмечает MJB, таблица может иметь не более одного первичного ключа и всегда должна иметь один (никогда не равный нулю). Однако таблица может иметь несколько ключей-кандидатов, один из которых обозначен как первичный ключ. В теории нормализации первичный ключ не является критическим; ключи-кандидаты (первичный ключ - один из ключей-кандидатов) имеют решающее значение в теоремах, связанных с нормализацией.

Примером таблицы с тремя возможными уникальными ключами является, соответственно, Таблица элементов, где атомный номер, символ или имя элемента могут использоваться как первичный ключ . Действительно, в зависимости от того, занимаетесь ли вы химией или физикой, атомный номер или символ могут быть наиболее подходящим первичным ключом, а другой будет альтернативным ключом (а имя элемента, вероятно, всегда будет альтернативным ключом, а не первичным). ключ):

CREATE TABLE elements
(
    atomic_number   INTEGER NOT NULL UNIQUE CONSTRAINT c1_elements
                    CHECK (atomic_number > 0 AND atomic_number < 120),
    symbol          CHAR(3) NOT NULL UNIQUE CONSTRAINT c2_elements,
    name            CHAR(20) NOT NULL UNIQUE CONSTRAINT c3_elements,
    atomic_weight   DECIMAL(8,4) NOT NULL,
    stable          CHAR(1) DEFAULT 'Y' NOT NULL
                    CHECK (stable IN ('Y', 'N'))
);

(Нотация для Informix Dynamic Server; различия между этим и Microsoft SQL Server или любой другой СУБД SQL довольно тривиальны. Вы можете видеть, что я не обозначил ни один из возможных ключей как «первичный ключ». Если бы я это сделал, я бы, вероятно, назначил Atomic_Number как первичный ключ.)


Спасибо за указатели, Томас. Я нашел это в ISO / IEC 9075-2: 2003 (SQL / Foundation):

§11,7 <unique constraint definition>

Функция

Укажите ограничение уникальности для таблицы.

Формат

<unique constraint definition> ::=
      <unique specification> <left paren> <unique column list> <right paren>
    | UNIQUE ( VALUE )
<unique specification> ::=
      UNIQUE
    | PRIMARY KEY
<unique column list> ::= <column name list>

Синтаксические правила

  1. Каждый столбец, обозначенный <column name> в <unique column list>, является операндом группировки операция. Применяются синтаксические правила подпункта 9.10 «Группировка операций».
  2. Позвольте T быть таблицей, идентифицированной содержащей <table definition> или <alter table statement>. Пусть TN будет <table name> из T.
  3. Если указано <unique column list> UCL, то

    а. Каждый <column name> в <unique column list> должен идентифицировать столбец T и тот же столбец не должны быть идентифицированы более одного раза.
    б. Набор столбцов в <unique column list> должен отличаться от уникальных столбцов любого другого уникальный дескриптор ограничения, включенный в дескриптор базовой таблицы T.
    с. Корпус:
    я. Если <unique specification> указывает ПЕРВИЧНЫЙ КЛЮЧ, тогда пусть SC будет <search condition>:

            UNIQUE ( SELECT UCL FROM TN )
            AND
            ( UCL ) IS NOT NULL
    

    II. В противном случае, пусть SC будет <search condition>:

            UNIQUE ( SELECT UCL FROM TN )
    
  4. Если указан UNIQUE (VALUE), тогда пусть SC будет <search condition>:

        UNIQUE ( SELECT TN.* FROM TN )
    
  5. Если в <unique specification> указан PRIMARY KEY, то для каждого <column name> в явном или неявный <unique column list>, для которого не указано NOT NULL, NOT NULL неявно присутствует в <column definition>.

  6. A <table definition> должно указывать не более одного явного или явного <unique constraint definition>, что задает ПЕРВИЧНЫЙ КЛЮЧ.

  7. Если <unique constraint definition>, который задает PRIMARY KEY, содержится в <add table constraint definition>, то таблица, указанная <table name>, непосредственно содержащаяся в содержащем <alter table statement>, не должна иметь уникального ограничения, которое было определено <unique constraint definition> что указано ПЕРВИЧНЫЙ КЛЮЧ.

Правила доступа

Отсутствует.

Общие правила

  1. A <unique constraint definition> определяет уникальное ограничение.
    ПРИМЕЧАНИЕ 254. - В подпункте 10.8 «<constraint name definition> и <constraint characteristics>» указывается, когда ограничение эффективно проверено.
  2. Уникальное ограничение не выполняется тогда и только тогда, когда

      EXISTS ( SELECT * FROM TN WHERE NOT ( SC ) )
    

    верно.

Правила соответствия

  1. Без функции S291 «Уникальное ограничение на всю строку» соответствующий язык SQL не должен содержать UNIQUE (VALUE).
  2. Без функции T591 «УНИКАЛЬНЫЕ ограничения, возможно, нулевых столбцов», в соответствующем языке SQL, если UNIQUE, затем <column definition> для каждого столбца, в котором содержится <column name> в <unique column list> должно содержаться NOT NULL.

ПРИМЕЧАНИЕ 255. - Применяются также правила соответствия подраздела 9.10 «Группировка».


Добро пожаловать в миружасный мир стандарта SQL! Кажется, что функция T591 допускает, возможно, нулевые значения в столбцах ограничения UNIQUE (но не в столбцах PRIMARY KEY). В результате вы должны понять, как работает следующий запрос, когда в любом из столбцов UCL (списка уникальных столбцов) есть NULL:

      EXISTS ( SELECT * FROM TN WHERE NOT (
               UNIQUE ( SELECT UCL FROM TN ) ) )

И я знаю, что не уверен, как в этих условиях работает УНИКАЛЬНАЯ операция.


§8.10 <unique predicate>

Функция

Укажите тест на отсутствие повторяющихся строк.

Формат

<unique predicate> ::= UNIQUE <table subquery>

Синтаксические правила

  1. Каждый столбец пользовательского типа в результате <table subquery> должен иметь тип сравнения.
  2. Каждый столбец <table subquery> является операндом операции группировки. Синтаксические правила Подпункт 9.10, «Операции по группированию», применяется.

Правила доступа

Отсутствует.

Общие правила

  1. Пусть T будет результатом.
  2. Если в T нет двух строк, так что значение каждого столбца в одной строке не является нулевым и не является отличным из значения соответствующего столбца в другой строке, то результат <unique predicate> Правда; в противном случае результат равен False.

Правила соответствия

1) Без функции F291, «УНИКАЛЬНОГО предиката», соответствующий язык SQL не должен содержать <unique predicate>.

ПРИМЕЧАНИЕ 193. - Применяются также правила соответствия, изложенные в подпункте 9.10, «Операции по группированию».

0 голосов
/ 24 июня 2010

Нет, таблица не может иметь более одного PK.

Однако она может иметь составной ключ (один PK, который содержит более одного столбца в своем определении).Кроме того, вы можете иметь несколько уникальных ограничений, которые также могут охватывать несколько столбцов.

0 голосов
/ 24 июня 2010

Насколько я знаю, только один.Однако вы можете иметь более одного столбца (обычно до 8 или 20, в зависимости от СУБД) в сочетании с другими в качестве составного ключа для уникальной идентификации строки.Единственный первичный ключ, один столбец или составной, также можно использовать для присоединения к внешнему ключу в другой таблице (отношения «один ко многим», «многие к одному» или «многие ко многим»).

...