2012-01-12 1 views
31

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

+0

Вы имеете в виду, что бы SQL-сервер создавал таблицу? –

+3

Это очень распространенный случай в инфраструктурах ORM, которые поддерживают сопоставление наследования, делая сопоставление таблицы за класс. Например, если класс B наследуется от класса A и сопоставлен с таблицей_a и table_b, часто бывает, что экземпляры B имеют одинаковый идентификатор на table_a и table_b, а table_b определяет FK в столбце id в таблице_a id столбец. Просто попробуйте определить FK и PK с помощью SQLServer Management Studio. –

ответ

47

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

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 
); 

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

+0

Так же, как FYI, в 'information_schema.key_column_usage' для таблицы' UserToGroup', как 'UserID', так и' GroupID' будут возвращать по две строки каждый ... один для PK, один для FK ... [в отношении ...] (http://stackoverflow.com/a/15622288/623952) –

7

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

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

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

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

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

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

1

Только быстрое примечание - из страниц Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx) ...

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

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

3

Это, вероятно, не очень хорошая идея, поскольку часто вы хотите разрешить дублирование внешних ключей в таблице. Даже если вы не сейчас, в будущем, вы могли бы, поэтому лучше не делать этого. См. Is it fine to have foreign key as primary key?

+1

Почему бы и нет? Как и ссылка, которую вы положили, в ней говорится, что есть случаи, такие как отношения 1 к 1, где в этом может быть необходимо –

+0

Я не сказал, что ВСЕГДА плохая идея;) Вы правы, могут быть исключения, где это будет всегда быть 1: 1. Мой комментарий здесь, чтобы люди думали о правильном выборе для них. – thebiggestlebowski