Первичный и внешний ключи одновременно - PullRequest
38 голосов
/ 13 января 2012

Возможно ли в SQL Server 2008 создать таблицу с двумя столбцами, которые являются одновременно первичными и внешними ключами? Если да, как будет выглядеть такой код? Я искал и ничего не нашел.

Ответы [ 4 ]

54 голосов
/ 13 января 2012

Конечно, нет проблем:

CREATE TABLE dbo.[User]
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [Group] 
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [UserToGroup]
(
  UserId int NOT NULL,
  GroupId int NOT NULL,
  PRIMARY KEY CLUSTERED ( UserId, GroupId ),
  FOREIGN KEY ( UserId ) REFERENCES [User] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE,
  FOREIGN KEY ( GroupId ) REFERENCES [Group] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE
);

Это довольно часто используется для моделирования отношений «многие ко многим».

8 голосов
/ 13 января 2012

Это совершенно разные конструкции.

A Первичный ключ используется для обеспечения уникальности в таблице и является уникальным идентификатором для определенной записи.

A Внешний ключ используется для ссылочной целостности, чтобы убедиться, что значение существует в другой таблице.

Внешний ключ должен ссылаться на первичный ключ в другой таблице.

Если вы хотите иметь внешний ключ, который также является уникальным, вы можете установить ограничение FK и добавить уникальный индекс / ограничение к тому же полю.

В справочных целях SQL Server позволяет FK ссылаться на UNIQUE CONSTRAINT, а также на поле PRIMARY KEY.

3 голосов
/ 14 ноября 2014

Это, вероятно, не очень хорошая идея, поскольку часто вы хотите разрешить дублирование внешних ключей в таблице.Даже если вы этого не сделаете сейчас, в будущем вы можете, так что лучше этого не делать.См. Можно ли использовать внешний ключ в качестве первичного ключа?

1 голос
/ 02 июня 2014

Просто краткая заметка - со страниц Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx)...

"Ограничение внешнего ключа не обязательно должно быть связано только с ограничением первичного ключа в другой таблице; его также можно определить для ссылки на столбцы ограничения UNIQUE в другой таблице."

Не часто используется, но в некоторых случаях полезен.

...