Создание составного внешнего ключа в SQL Server 2008

У меня есть две таблицы, для которых я хотел бы создать внешний ключ.

Первичная таблица

PK - Key1 - varchar(20)
PK - Key2 - date

Вторичная таблица

PK - AutoID
FK - Key1 - varchar(20)
FK - Key2 - date

Когда я пытаюсь создать связь между первичной и вторичной таблицами я продолжаю получать сообщение

Столбцы в первичной таблице не соответствуют первичному ключу или уникальны ограничение.

Во вторичной таблице может быть много записей с теми же ключами Key1 и Key2, поэтому мы сделали первичный ключ автоматически созданным числом.

Любые мысли о том, как я могу установить отношения внешнего ключа между этими двумя таблицами ?

30
задан marc_s 11 July 2011 в 15:30
поделиться

1 ответ

Здесь есть несколько хороших ответов, но я бы хотел сделать еще один шаг - ради потомков.

Внешний ключ должен ссылаться либо на ограниченный столбец Primary key (уникальный кластерный индекс), либо на Unique в другой таблице. По сути, необходимым компонентом является ограничение Unique. Я бы добавил, что вы можете иметь пустые столбцы в вашем внешнем ключе, НО, если вы разрешите пустые значения в «составном» ключе, SQL пропускает проверку данных в отношении внешнего ключа. Это важный момент, который следует помнить, поскольку основная причина, по которой большинство из нас использует внешние ключи, заключается в обеспечении целостности данных в наших базах данных.

В заключение я хотел бы явно объявить все мои имена ключей. Почему, спросите вы? Если в будущем вам потребуется использовать «Полнотекстовое индексирование» для улучшения возможностей поиска, это не заставит вас ссылаться на все «автоматически сгенерированные» имена ключей. Это может не иметь большого значения для небольших проектов, которые не требуют преобразования данных или запланированных обновлений полнотекстового индекса, но если вы создаете сценарий для этой функции, вы можете усложнить свою работу (например, искать фактическое имя вашего основного компьютера). Имя по умолчанию для ключа: pk_someTable_1248594832828495904).

Вот что я хотел бы сделать при написании SQL, чтобы избежать каких-либо ошибок в будущем:

  1. Не допускайте пустых значений в составных внешних ключах, если это возможно.
  2. Называйте ключи явно, используя согласованное соглашение об именах (например, 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 есть хорошая ссылка, обсуждающая это и многое другое на внешние ключи: Ограничение внешнего ключа .

7
ответ дан 27 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: