Здесь есть несколько хороших ответов, но я бы хотел сделать еще один шаг - ради потомков.
Внешний ключ должен ссылаться либо на Primary key
(уникальный, кластеризованный индекс), либо на Unique
ограниченный столбец в другой таблице.По сути, необходимым компонентом является ограничение Unique
.Я бы добавил, что вы можете иметь пустые столбцы в вашем внешнем ключе, НО, если вы разрешите пустые значения в «составном» ключе, SQL пропускает проверку данных в отношении внешнего ключа.Это важный момент, который следует помнить, поскольку основная причина, по которой большинство из нас использует внешние ключи, заключается в обеспечении целостности данных в наших базах данных.
В заключение я хотел бы явно объявить все мои имена ключей.Почему, спросите вы?Если в будущем вам потребуется использовать «Полнотекстовое индексирование» для улучшения возможностей поиска, это не заставит вас ссылаться на все «автоматически сгенерированные» имена ключей.Это может не иметь большого значения для небольших проектов, которые не требуют преобразования данных или запланированных обновлений полнотекстового индекса, но если вы создаете сценарий для этой функции, вы можете усложнить свою работу (например, искать фактическое имя вашего основного компьютера).Имя ключа по умолчанию: pk_someTable_1248594832828495904
).
Вот что я хотел бы сделать при написании SQL-кода, чтобы избежать возможных ошибок:
- Не разрешать пустые значения в составных внешних ключах, если это возможно.
- Назовите ключи явно, используя согласованное соглашение об именах (например,
PK_Schema/56_TalbeName_Col1_Col2
).Это не только дает вам стандартное имя для ключа, но и из индекса легко увидеть, на какие столбцы ссылаются и в каком порядке.
Код:
CREATE TABLE MySchema.PrimaryTable (
Key1 varchar(20) NOT NULL,
Key2 date NOT NULL,
CONSTRAINT PK_MySchema_PrimaryTable_Key1_Key2 PRIMARY KEY (Key1, Key2)
)
GO
CREATE TABLE MySchema.SecondaryTable (
AutoID int IDENTITY,
Key1 varchar(20) NOT NULL,
Key2 date NOT NULL,
CONSTRAINT FK_MySchema_SecondaryTable_Key1_Key2
FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (Key1, Key2)
)
GO
OptillectTeam в основном мертв с его ответом.Я просто хотел уточнить несколько важных вещей, которые не были упомянуты ранее.На сайте MSDN есть хорошая ссылка, обсуждающая это и многое другое на внешние ключи: Ограничение внешнего ключа .