oracle - ¿La clave externa siempre hace referencia a una clave única en otra tabla?
key parent (3)
¿No es posible que la clave externa (columna única) en una tabla secundaria haga referencia a una clave principal que tenga algunos valores duplicados?
No, no es posible.
Cuando define una restricción de clave externa en una tabla, significa que solo hay una clave correspondiente en la tabla externa. Si existieran múltiplos en la tabla externa, ¿cuál sería el significado?
Wikipedia tiene esta definición en la entrada de clave externa :
Una clave externa es un campo en una tabla relacional que coincide con una clave candidata de otra tabla
Las claves de los candidatos son únicas dentro de una tabla.
Sí, es posible que una clave externa haga referencia a una columna con valores duplicados.
Esto puede suceder si la clave principal utiliza un índice no único y no se valida cuando se crea. (Pero nunca he visto una situación como esta en la vida real. Como señaló @Bill Karwin, sería muy confuso. Por lo tanto, puede que esta no sea una situación de la que realmente deba preocuparse).
--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);
Según el estándar SQL, una clave externa debe hacer referencia a la clave principal o a una clave única de la tabla principal. Si la clave principal tiene varias columnas, la clave externa debe tener el mismo número y orden de columnas. Por lo tanto, la clave externa hace referencia a una fila única en la tabla principal; No puede haber duplicados.
Re tu comentario:
Si TA
es una clave principal, entonces no puede haber duplicados. Cualquier clave principal debe ser única y no nula. Por lo tanto, si la tabla secundaria tiene una clave externa que hace referencia a la clave primaria principal, debe coincidir con un valor único no nulo y, por lo tanto, hace referencia exactamente a una fila en la tabla principal. En este caso, no puede crear una fila secundaria que haga referencia a varias filas primarias.
Puede crear una fila secundaria cuya columna de clave externa sea NULL, en cuyo caso no hace referencia a ninguna fila en la tabla principal.