2010-08-24 4 views
1

Если я использую ForeignKey в SQL, всегда ли нужно использовать весь столбец таблицы, с которой я ссылаюсь?SQL ForeignKey Column

Так, например.

Table1

subjectID Firstname фамилия электронной

Table2:

автомобиль книги ForeignKey (SubjectID)

Могу ли я использовать только один столбец как ForeignKey, или я всегда нужно получить все столбцы?

Спасибо!

ответ

1

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

Итак, если родительская таблица имеет единственный столбец в своем первичном ключе, который является единственным столбцом, который необходимо использовать во внешнем ключе. Если родительская таблица имеет составной первичный ключ (т. Е. Несколько столбцов), то вам нужны все эти столбцы в дочерней таблице.

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

Вот пример работы (с использованием Oracle, но он работает одинаково во всех вариантах РСУБД). Сначала мы создаем родительскую таблицу с первичным ключом из одного столбца и ссылаемся на нее из дочерней таблицы.

SQL> create table t1 (id number not null, seqno number not null) 
    2/

Table created. 

SQL> alter table t1 add constraint t1_pk primary key (id) 
    2/

Table altered. 

SQL> create table t2 (id number not null, t1_id number not null, whatever varchar2(10)) 
    2/

Table created. 

SQL> alter table t2 add constraint t2_t1_fk foreign key (t1_id) 
    2    references t1 (id) 
    3/

Table altered. 

SQL> 

Простой достаточно. Но если мы отбросим эти ключи и дать T1 соединения, первичные ключи все разваливается ...

SQL> alter table t2 drop constraint t2_t1_fk 
    2/

Table altered. 

SQL> alter table t1 drop constraint t1_pk 
    2/

Table altered. 


SQL> alter table t1 add constraint t1_pk primary key (id, seqno) 
    2/

Table altered. 

SQL> alter table t2 add constraint t2_t1_fk foreign key (t1_id) 
    2    references t1 (id) 
    3/
      references t1 (id) 
          * 
ERROR at line 2: 
ORA-02270: no matching unique or primary key for this column-list 


SQL> 

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

SQL> alter table t2 add t1_seqno number 
    2/

Table altered. 

SQL> alter table t2 add constraint t2_t1_fk foreign key (t1_id, t1_seqno) 
    2    references t1 (id, seqno) 
    3/

Table altered. 

SQL> 
+0

На самом деле, он должен ссылаться только на уникальное ограничение, по крайней мере, на Oracle 10g. Вот почему ORA-02270 говорит, что «нет соответствующего уникального или первичного ключа для этого списка столбцов». –

+0

@AdamMusch - справедливая точка, я уточнил свой ответ. Тем не менее, я думаю, что довольно редко упоминается уникальный ключ, который не является первичным ключом. – APC

+0

Необычный, уверенный, но возможно.Я был известен с ассоциативными записями с несколькими таблицами (у A есть много ко многим с B и многими-ко-многим с C), чтобы не иметь первичного ключа, а только уникальное ограничение на (A_pk, B_pk, C_pk), поскольку наличие суррогатного ключа для этого ассоциативного объекта добавляет очень мало значения. Это в одной таблице, чтобы избежать распространения таблиц - B и C являются контекстно подобными, но разными объектами. –

1

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

+0

И как я могу получить только одну колонку? – digit

+0

Вам нужно будет написать sql для создания ограничения FK: http://en.wikipedia.org/wiki/Foreign_key – cofiem

0

Простыми словами первичный ключ таблицы используется в качестве внешнего ключа в других таблицах. Мы не используем все столбцы таблицы как внешние ключи в других таблицах (это опять-таки приведет к избыточности, которая опять-таки пробламатична).

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