Как отмечает 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>
Синтаксические правила
- Каждый столбец, обозначенный
<column name>
в <unique column list>
, является операндом группировки
операция. Применяются синтаксические правила подпункта 9.10 «Группировка операций».
- Позвольте T быть таблицей, идентифицированной содержащей
<table definition>
или <alter table statement>
. Пусть TN будет <table name>
из T.
Если указано <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 )
Если указан UNIQUE (VALUE), тогда пусть SC будет <search condition>
:
UNIQUE ( SELECT TN.* FROM TN )
Если в <unique specification>
указан PRIMARY KEY, то для каждого <column name>
в явном или
неявный <unique column list>
, для которого не указано NOT NULL, NOT NULL неявно присутствует в <column
definition>
.
A <table definition>
должно указывать не более одного явного или явного <unique constraint definition>
, что
задает ПЕРВИЧНЫЙ КЛЮЧ.
- Если
<unique constraint definition>
, который задает PRIMARY KEY, содержится в <add table constraint
definition>
, то таблица, указанная <table name>
, непосредственно содержащаяся в содержащем <alter
table statement>
, не должна иметь уникального ограничения, которое было определено <unique constraint definition>
что указано ПЕРВИЧНЫЙ КЛЮЧ.
Правила доступа
Отсутствует.
Общие правила
- A
<unique constraint definition>
определяет уникальное ограничение.
ПРИМЕЧАНИЕ 254. - В подпункте 10.8 «<constraint name definition>
и <constraint characteristics>
» указывается, когда ограничение
эффективно проверено.
Уникальное ограничение не выполняется тогда и только тогда, когда
EXISTS ( SELECT * FROM TN WHERE NOT ( SC ) )
верно.
Правила соответствия
- Без функции S291 «Уникальное ограничение на всю строку» соответствующий язык SQL не должен содержать
UNIQUE (VALUE).
- Без функции 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>
Синтаксические правила
- Каждый столбец пользовательского типа в результате
<table subquery>
должен иметь тип сравнения.
- Каждый столбец
<table subquery>
является операндом операции группировки. Синтаксические правила
Подпункт 9.10, «Операции по группированию», применяется.
Правила доступа
Отсутствует.
Общие правила
- Пусть T будет результатом.
- Если в T нет двух строк, так что значение каждого столбца в одной строке не является нулевым и не является отличным
из значения соответствующего столбца в другой строке, то результат
<unique predicate>
Правда; в противном случае результат равен False.
Правила соответствия
1) Без функции F291, «УНИКАЛЬНОГО предиката», соответствующий язык SQL не должен содержать <unique
predicate>
.
ПРИМЕЧАНИЕ 193. - Применяются также правила соответствия, изложенные в подпункте 9.10, «Операции по группированию».