Внешний ключ должен ссылаться на уникальный ключ, обычно первичный ключ.
Итак, если родительская таблица имеет единственный столбец в своем первичном ключе, который является единственным столбцом, который необходимо использовать во внешнем ключе. Если родительская таблица имеет составной первичный ключ (т. Е. Несколько столбцов), то вам нужны все эти столбцы в дочерней таблице.
Это одна из причин, почему люди склонны избегать использования сложных первичных ключей в пользу суррогатных ключей и уникальных ограничений.
Вот пример работы (с использованием 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>
На самом деле, он должен ссылаться только на уникальное ограничение, по крайней мере, на Oracle 10g. Вот почему ORA-02270 говорит, что «нет соответствующего уникального или первичного ключа для этого списка столбцов». –
@AdamMusch - справедливая точка, я уточнил свой ответ. Тем не менее, я думаю, что довольно редко упоминается уникальный ключ, который не является первичным ключом. – APC
Необычный, уверенный, но возможно.Я был известен с ассоциативными записями с несколькими таблицами (у A есть много ко многим с B и многими-ко-многим с C), чтобы не иметь первичного ключа, а только уникальное ограничение на (A_pk, B_pk, C_pk), поскольку наличие суррогатного ключа для этого ассоциативного объекта добавляет очень мало значения. Это в одной таблице, чтобы избежать распространения таблиц - B и C являются контекстно подобными, но разными объектами. –