2009-11-13 11 views
5

Sé lo que son, mi pregunta es, ¿cómo se vinculan o se vinculan automáticamente cuando tiene nombres idénticos en tablas diferentes. Aquí hay un ejemplo:¿Alguien puede explicar las claves externas de MySQL?

Supongo que tengo una tabla [pedidos] y una tabla [cliente]. Cada fila en la tabla [pedidos] tiene un número de cliente_id que está asociado con el ID_cliente en la tabla [cliente]. Entonces, ¿cómo obtengo la información del cliente al hacer referencia al pedido? ¿Cuál sería la consulta SQL?

Respuesta

1

Las claves externas en mysql solo están disponibles para ciertos motores de base de datos. MyISAM no es uno de ellos.

He intentado usarlos con InnoDB y si bien garantizó la coherencia de los datos, encontré que era enorme golpe de rendimiento, causando muchas tablas bloqueadas que nunca deberían haber sido bloqueadas.

La principal ventaja de utilizar claves externas es asegurarse de que nunca tenga un pedido que no tenga un cliente en la base de datos. Pero aún necesitará acceder al cliente por consulta.

select * from customer, order where order.customer_id = customer.id and order.id = 5 

La consulta anterior que muestra una idea general de cómo acceder a ella a través de un perezoso unirse, a pesar de que está seco y tienen un código que puede tener un error tipográfico o dos allí.

Mi opinión general sobre las claves externas es que son geniales, pero no se pueden usar en MySQL y que Postgres las maneja mucho mejor.

4

Las claves externas son no vinculadas automáticamente por nombres comunes. Una cosa que confunde a las personas con respecto a las claves externas de MySQL es que el motor de tabla MyISAM (el valor predeterminado) no admite claves foráneas en absoluto. En lugar de dar un mensaje de error al agregar una clave externa a una tabla MyISAM, MySQL ignora silenciosamente la definición de clave externa. Las claves externas son compatibles con el motor de tabla InnoDB, por lo que debe asegurarse de que todas las tablas a las que desea agregar claves externas sean del tipo de tabla InnoDB. Para agregar una clave externa se hace algo como esto:

alter table fk_table add foreign key (fk_column) references pk_table (pk_column); 
+0

También es importante recordar que MySQL descarta de forma silenciosa la sintaxis de la clave externa en línea en el momento de creación de la tabla, p. 'CREATE TABLE foo (... bar int (5) unsigned not null references baz (bar) ...) ENGINE = InnoDB;' ** NO ** creará una clave foránea. Siempre especifique las claves foráneas explícitamente después de las declaraciones de campo como 'CREATE ... (... FOREIGN KEY key_name (column_name) REFERENCES foreign_table (foreign_column) ON UPDATE ... ON DELETE ...)' sintaxis. Espero que esto ayude. – Dereleased

7

... ¿cómo se les vinculan o son enlazadas automáticamente cuando se tiene nombres idénticos en diferentes tablas.

Esto no es automático, hay que añadir un foreign key constraint en la columna de la customer_id de la mesa order. Esto se puede hacer en el momento de creación de la tabla o usando una instrucción ALTER. Verifique la documentación para los detalles. Como señalaron otros, tenga en cuenta que ambas tablas deben ser tablas InnoDB (las restricciones de clave externa no son compatibles con el motor de almacenamiento MyISAM que las ignorará).

Con o sin una restricción FK, la consulta sería algo así como:

SELECT * 
FROM CUSTOMER C, ORDER O 
WHERE C.ID = O.CUSTOMER_ID 
AND O.ID = ... 

restricción A FK sería "sólo" garantía de que la columna CUSTOMER_ID de la tabla de orden no puede contener valores que no existen en la tabla CUSTOMER (excepto potencialmente NULL) y así imponer la integridad referencial.

3

Supongo que está preguntando porque ha leído la documentación y no tiene sentido para usted.

Una clave foránea (FK) es un campo en TableB que tiene el mismo valor que un campo, generalmente la clave principal (PK), en TableA. Así, en pseudocódigo:

Create TableA: 
A_id is PK, 
somefield, 
anotherfield 

Create TableB: 
B_id is PK, 
A_id is FK to TableA, 
farmfield, 
outstandingfield 

Create constraint on TableB: 
In TableB A_id references TableA(A_id), 
Don't allow updates to TableA(A_id), 
Delete records from TableB that have the same A_id as deleted records in TableA 

A continuación, cuando se hace una consulta que implica ambas tablas, puede unirse en su FK:

SELECT a.somefield, b.farmfield FROM TableA a JOIN TableB b ON (a.A_id=B.A_id); 

Y cuando se elimina de la Tabla A, que no tienen que eliminar de TableB. Sucederá automáticamente porque la restricción dice "Eliminar registros de TableB que tienen el mismo A_id que los registros eliminados en la Tabla A".

Y cuando inserte en TableB, tendrá que dar un A_id válido o, según cómo haya definido la columna, dejar A_id =NULL.

+0

¿cómo se crea una restricción en un TableB (cuál es la consulta)? – Ross

+0

Eso estaría en el manual que asumí que leyó: http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html – dnagirl

+0

-1 porque: "Asumiré lo estás preguntando porque leíste la documentación y no tenía sentido para ti ". es algo bastante arrogante decirlo, era completamente innecesario en esta pregunta. – jwir3

Cuestiones relacionadas