Можно ли в SQL Server 2008 иметь таблицу, созданную с двумя столбцами, которые в то же время являются первичными и внешними ключами? Если да, как выглядит такой код? Я искал и ничего не придумал.
Первичный и внешний ключ одновременно
Ответ 1
Конечно, никаких проблем:
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
);
Это довольно часто используется для моделирования отношений "многие ко многим".
Ответ 2
Это совершенно разные конструкции.
A Основной ключ используется для обеспечения уникальности внутри таблицы и является уникальным идентификатором для определенной записи.
A Внешний ключ используется для ссылочной целостности, чтобы убедиться, что значение существует в другой таблице.
Внешний ключ должен ссылаться на первичный ключ в другой таблице.
Если вы хотите иметь внешний ключ, который также является уникальным, вы можете сделать ограничение FK и добавить уникальный индекс/ограничение в это же поле.
В справочных целях SQL Server позволяет FK ссылаться на UNIQUE CONSTRAINT
, а также на поле PRIMARY KEY
.
Ответ 3
Это, вероятно, не очень хорошая идея, поскольку часто вы хотите разрешить дублирование внешних ключей в таблице. Даже если вы не сейчас, в будущем, вы могли бы, поэтому лучше не делать этого. См. Хорошо ли иметь внешний ключ в качестве первичного ключа?
Ответ 4
Простое примечание - с страниц Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx)...
"Ограничение внешнего ключа не должно быть связано только с ограничением первичного ключа в другой таблице, его также можно определить для ссылки на столбцы ограничения UNIQUE в другой таблице".
Не используется часто, но полезно в некоторых случаях.