Внешний ключ должен ссылаться на уникальный ключ, обычно первичный ключ.
Итак, если родительская таблица имеет один столбец в своем первичном ключе, который является единственным столбцом, который необходимо использовать во внешнем ключе.Если родительская таблица имеет составной первичный ключ (то есть несколько столбцов), то вам нужны все эти столбцы в дочерней таблице.
Это одна из причин, по которой люди стремятся избегать использования составных первичных ключей в пользу суррогатных ключей.и уникальные ограничения.
Вот рабочий пример (с использованием 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>