Можно ли в SQL Server 2008 иметь таблицу, созданную с двумя столбцами, которые являются одновременно первичными и внешними ключами? Если да, как выглядит такой код? Я искал и ничего не придумал.Первичный и внешний ключ в то же время
ответ
Конечно, нет проблем:
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
);
Это довольно широко используется для моделирования много-ко-многим отношений.
Так же, как FYI, в 'information_schema.key_column_usage' для таблицы' UserToGroup', как 'UserID', так и' GroupID' будут возвращать по две строки каждый ... один для PK, один для FK ... [в отношении ...] (http://stackoverflow.com/a/15622288/623952) –
Это совершенно разные конструкции.
A Основной ключ используется для обеспечения уникальности внутри таблицы и является уникальным идентификатором для определенной записи.
A Запасной ключ используется для ссылочной целостности, чтобы убедиться, что значение существует в другой таблице.
Иностранный ключ должен ссылаться на первичный ключ в другой таблице.
Если вы хотите иметь внешний ключ, который также является уникальным, вы можете сделать ограничение FK и добавить уникальный индекс/ограничение в это же поле.
Для справки SQL Server позволяет FK ссылаться на UNIQUE CONSTRAINT
, а также на поле PRIMARY KEY
.
Только быстрое примечание - из страниц Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx) ...
«Ограничение внешнего ключа не должен быть связан только с ограничением первичного ключа в другой таблице, она также может быть определена для ссылки столбцы ограничения UNIQUE в другой таблице. "
Не используется часто, но полезно в некоторых случаях.
Это, вероятно, не очень хорошая идея, поскольку часто вы хотите разрешить дублирование внешних ключей в таблице. Даже если вы не сейчас, в будущем, вы могли бы, поэтому лучше не делать этого. См. Is it fine to have foreign key as primary key?
Почему бы и нет? Как и ссылка, которую вы положили, в ней говорится, что есть случаи, такие как отношения 1 к 1, где в этом может быть необходимо –
Я не сказал, что ВСЕГДА плохая идея;) Вы правы, могут быть исключения, где это будет всегда быть 1: 1. Мой комментарий здесь, чтобы люди думали о правильном выборе для них. – thebiggestlebowski
Вы имеете в виду, что бы SQL-сервер создавал таблицу? –
Это очень распространенный случай в инфраструктурах ORM, которые поддерживают сопоставление наследования, делая сопоставление таблицы за класс. Например, если класс B наследуется от класса A и сопоставлен с таблицей_a и table_b, часто бывает, что экземпляры B имеют одинаковый идентификатор на table_a и table_b, а table_b определяет FK в столбце id в таблице_a id столбец. Просто попробуйте определить FK и PK с помощью SQLServer Management Studio. –