2012-01-02 16 views

Respuesta

22

Según el estándar SQL, una clave externa debe hacer referencia a la clave principal o a una clave única de la tabla padre. 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 padre; no puede haber duplicados.


Re tu comentario:

Si T.A es una clave principal, entonces no, no puede tener ningún duplicado. 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 principal del padre, 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 hacer una fila secundaria que haga referencia a varias filas primarias.

puede crear una fila secundaria cuya columna de clave externa es NULA, en cuyo caso no hace referencia a ninguna fila en la tabla principal.

+0

Gracias, pero si hablamos de clave externa de una sola columna como la columna 'a' es la clave anterior en la tabla secundaria t que hace referencia a la columna 'A' en la tabla padre T, ahora no es posible en ninguna situación que la columna A pueda tener duplicar los valores en la tabla T? ¿significa que las aleaciones de niebla de clave extranjera se refieren a una clave primaria en otra tabla? – ratsy

+1

@ratsy: una clave externa siempre debe referirse a una columna o columnas declaradas como PRIMARY KEY o UNIQUE. (A menos que esté utilizando MySQL. Sin embargo, aún debe orientar solo columnas PRIMARY KEY o UNIQUE incluso en MySQL. Busque en http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints. html para "el sistema no exige el requisito de que las columnas a las que se hace referencia sean ÚNICAS".) –

+0

@Catcall: Es cierto, pero @ratsy etiquetó esta pregunta 'oracle', por lo que no mencioné el comportamiento no estándar de InnoDB. Incluso cuando se usa InnoDB, recomiendo encarecidamente que no se hagan referencias a filas primarias no únicas, porque es fácil confundirse de esa manera. –

6

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 extranjera, ¿cuál sería?

Wikipedia tiene esta definición en el Foreign key entrada:

Una clave externa es un campo en una tabla relacional que coincide con una clave candidata de otra tabla

claves candidatas son únicos dentro de una tabla .

+0

Gracias por su ayuda. – ratsy

7

Sí, es posible que una clave foránea 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 ésta en la vida real. Como @ Bill Karwin señaló, sería muy confuso. Así que esto puede no ser una situación que realmente necesita para 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); 
+0

Wacky. Creo que esto cae en la categoría de "¿por qué harías eso?" :-) ¡Pero gracias por el claro ejemplo! –

+0

¡Gracias Jonearles por el ejemplo anterior! ... la misma situación en la base de datos que estoy usando, pero ¿por qué y cómo ...? – ratsy

+0

Existen varias buenas razones para usar un índice no único para una clave principal; restricciones diferibles, más opciones para la reconstrucción (específicamente el paralelismo), índice existente antes de la restricción, etc. Mire aquí para obtener información sobre índices únicos versus no exclusivos: http://richardfoote.wordpress.com/2008/06/04/primary -keys-and-non-unique-indexes-whats-really-happening/ El NOVALIDATE es un poco extraño. Por lo que yo sé, no hay ventajas de usar eso, a menos que solo necesites algunos datos "malos". Esos casos realmente deberían documentarse. Si no está documentado, ¿tal vez fue solo un error? –

Cuestiones relacionadas