Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

По стандарту SQL внешний ключ должен ссылаться либо на первичный ключ, либо на уникальный ключ родительской таблицы. Если первичный ключ имеет несколько столбцов, внешний ключ должен иметь одинаковый номер и порядок столбцов. Поэтому внешний ключ ссылается на уникальную строку в родительской таблице; не может быть дубликатов.


Ваш комментарий:

Если T.A является первичным ключом, то нет, у вас не может быть дубликатов. Любой первичный ключ должен быть уникальным и непустым. Поэтому, если в дочерней таблице есть внешний ключ, ссылающийся на родительский первичный ключ, он должен соответствовать непустому, уникальному значению и поэтому ссылается только на одну строку в родительской таблице. В этом случае вы не можете создать дочернюю строку, которая ссылается на несколько родительских строк.

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

Ответ 2

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

Это может произойти, если первичный ключ использует не уникальный идентификатор и не проверяется при его создании. (Но я никогда не видел такой ситуации в реальной жизни. Как заметил @Bill Karwin, это было бы очень запутанно. Так что это может быть не такая ситуация, о которой вам действительно нужно беспокоиться.)

--Create a table with two duplicate rows
create table test1(a number);
insert into test1 values(1);
insert into test1 values(1);
commit;

--Create a non-unique index
create index test1_index on test1(a);

--Use the non-unique index for the primary key, do not validate
alter table test1 add constraint test1_pk primary key (a)
    using index test1_index novalidate;

--Build another table with a foreign key to TABLE1
create table test2(a number,
    constraint test2_fk foreign key (a) references test1(a));

--Inserting a value that refers to the duplicate value still works.
insert into test2 values(1);
commit;

--The foreign key still works:
--ORA-02291: integrity constraint (TEST2_FK) violated - parent key not found
insert into test2 values(2);

--The primary key works as expected, but only for new values:
--ORA-00001: unique constraint (TEST1_PK) violated
insert into test1 values(1);

Ответ 3

Нет, это невозможно.

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

Википедия имеет это определение в записи Foreign key:

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

Ключи кандидата уникальны в таблице.