2010-05-24 1 views
35

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

+0

Зачем вам это нужно? – JeffO

+0

нет никакой конкретной причины, почему кто-то спросил меня об этом, и я запутался, поэтому я просто хотел знать, что это – Mac

+0

Почему? Ну, это зависит от того, каковы ваши причины для выбора первичного ключа в первую очередь - формально говоря, нет абсолютной причины выбора одного первичного ключа над другим, поэтому нет никаких оснований говорить, почему это было бы или не было бы одинаковым один используется для ссылок на внешние ключи. Кроме того, в некоторых случаях потенциально желательно использовать более одного ключа кандидата для каждой таблицы в качестве ссылки на внешний ключ. В этом случае одна из этих ссылок, очевидно, не является основным ключом - если вы не хотите называть более одного ключа «основным»! – sqlvogel

ответ

40

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

CREATE UNIQUE INDEX UX01_YourTable ON dbo.YourTable(SomeUniqueColumn) 

ALTER TABLE dbo.YourChildTable 
    ADD CONSTRAINT FK_ChildTable_Table 
    FOREIGN KEY(YourFKColumn) REFERENCES dbo.YourTable(SomeUniqueColumn) 
+5

Это правильно в Microsoft SQL Server, но это не stanard SQL и не поддерживается всеми другими СУБД. В стандартном SQL стандарте SQL нет такой вещи, как индекс, и ограничения FOREIGN KEY всегда необходимы для соответствия ограничениям UNIQUE или PRIMARY KEY. Лично я всегда предпочитаю использовать уникальные ограничения, а не уникальные индексы без ограничения. Я думаю, что ограничение делает намеченное значение более понятным, а синтаксис ограничений более понятен другому разработчику базы данных. – sqlvogel

+4

@David: да, но OP спрашивал о SQL Server ..... –

13

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

Подробно ограничение, называемое FOREIGN KEY в SQL, не совсем эквивалентно определению внешнего ключа в реляционной модели. FOREIGN KEY ограничение в SQL отличается тем, что:

  • он может ссылаться на любой набор столбцов, подлежащих ограничение уникальности, даже если они не являются кандидатами на ключи (superkeys или обнуляемых столбцы, например).
  • может содержать нули, и в этом случае ограничение не применяется
  • его синтаксис зависит от порядка столбцов, поэтому ограничение fk на (A, B), ссылающееся (A, B), отличается от ограничения на (B , A) ссылки (A, B).
+0

APC не уверен, почему вы хотите отредактировать это, чтобы заменить «SQL» на «SQL Server». Мои комментарии относятся к SQL (что означает стандартный язык, определенный ISO). Они применимы ко всем реализациям SQL, с которыми я знаком - не только SQL Server. – sqlvogel

+0

Да, что это такое с этими людьми, которые редактируют сообщения, не зная, что они делают. Я голосую за запрет на редактирование ответов. – PerformanceDBA

3

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

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

0

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