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

#sql #database #oracle #foreign-keys #foreign-key-relationship

#sql #База данных #Oracle #внешние ключи #foreign-key-relationship

Вопрос:

у меня есть эти таблицы :

 create table t_table(t1 int, constraint tprim primary key(t1));

create table parent_table(t1 int, p1 int, p2 int, constraint pprim primary key(t1, p1));

create table child_table(t1 int, c1 int, p1 int, constraint cprim primary key(t1, c1), constraint fchild foreign key (p1) references parent_table(p1));
  

я получаю эту ошибку при создании второй таблицы :

 ORA-02270: no matching unique or primary key for this column-list
  

p1 в parent_table не является уникальным, поэтому я не могу сделать его уникальным для решения проблемы.

в этом случае как сказать, что p1 это внешний ключ в дочерней таблице, который ссылается на родительскую таблицу (p1)?

заранее спасибо.

Ответ №1:

Вы не можете. Внешний ключ ссылается на первичный ключ. Возможно, то, что вы хотите сделать, это включить t1 во внешний ключ child_table? Или же, если вам действительно нужно что-то вроде p1, чтобы быть FK в child_table, возможно, вам нужна еще одна таблица, только для p1, с уникальными значениями? Тогда p1 как в родительской, так и в дочерней таблицах является FK, указывающим на эту дополнительную таблицу.

Комментарии:

1. пожалуйста, что вы имели в виду Perhaps what you want to do is to include t1 in the foreign key to child_table? , вы имеете в виду в том же ограничении внешнего ключа (с p1), если это так, как это возможно, если два ключа принадлежат разным таблицам?

2. @youzking — они не принадлежат разным таблицам. (t1, p1) в ссылках на дочернюю таблицу (t1, p1) в родительской таблице — даже если ни только t1, ни только p1 не являются PK для родительской таблицы. Пара ЯВЛЯЕТСЯ первичным ключом, и вам разрешено ссылаться на нее из child_table.

3. о да, конечно, поскольку t1 был первым первичным ключом в t_table, я полагаю, что он принадлежит t_table , я забыл, что это было то же самое имя в child_table. большое вам спасибо.

Ответ №2:

это невозможно, вы должны ссылаться на первичный ключ