¿No es posible que la clave externa (columna única) en una tabla secundaria haga referencia a una clave principal que tiene algunos valores duplicados?¿la clave externa siempre hace referencia a una clave única en otra tabla?
Respuesta
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.
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 .
Gracias por su ayuda. – ratsy
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);
Wacky. Creo que esto cae en la categoría de "¿por qué harías eso?" :-) ¡Pero gracias por el claro ejemplo! –
¡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
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? –
- 1. MySQL - Clave externa única
- 2. Referencia de clave externa a la tabla en otro esquema
- 3. ¿Es posible establecer una restricción única como una clave externa en otra tabla?
- 4. Clave primaria compuesta, clave externa. ¿Referencia a objeto o clave?
- 5. ¿Cómo puedo crear una clave externa que hace referencia a una clave compuesta entero?
- 6. clave externa que hace referencia una clave principal 2 columnas en SQL Server
- 7. ¿podemos tener una clave externa que no sea la clave principal en ninguna otra tabla?
- 8. clave única en toda la tabla mysql?
- 9. Clave externa para la clave compuesta
- 10. Por qué crear una restricción de clave externa que hace referencia a la clave primaria de la misma tabla desde el campo de clave principal
- 11. clave externa en la tabla myisam alternativa?
- 12. Cómo obtener la tabla una clave externa se refiere a
- 13. Clave externa en la tabla A -> B, y clave externa en la tabla B -> A. ¿Cómo se hace esto?
- 14. ¿Cómo agrego una clave externa a una tabla SQLite existente?
- 15. Django: cómo tener una varias claves externas hace referencia a la misma tabla en una tabla
- 16. ¿Clave externa a una de muchas tablas?
- 17. POSTGRESQL Clave externa que hace referencia a las claves principales de dos tablas diferentes
- 18. clave externa a varias tablas
- 19. ¿Clave externa de columna múltiple en MySQL?
- 20. clave externa condicional PostgreSQL
- 21. Cómo eliminar una clave única de la tabla mysql
- 22. Django: UserProfile con clave externa única en Django Admin
- 23. Clave externa de tabla SQL que es parte de una clave primaria compuesta
- 24. Clave externa de Mysql por clave no única: ¿cómo es posible?
- 25. clave externa cakephp no la clave primaria
- 26. JDBC obtiene la relación + atributo al que hace referencia una clave externa
- 27. ¿Cómo se actualiza una tabla con una clave externa a otra tabla en el modelo de entidad ADO.Net?
- 28. MySQL: Insertar si existe una clave externa
- 29. ¿Qué es exactamente una clave externa?
- 30. Cuándo utilizar una clave externa en MySQL
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
@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".) –
@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. –