En MySQL Server 3.23.44 y posteriores, el motor
InnoDB
soporta chequeo para restricciones
de claves foráneas, incluyendo CASCADE
,
ON DELETE
, y ON UPDATE
.
Consulte Sección 15.6.4, “Restricciones (constraints) FOREIGN KEY
”.
Para otros motores diferentes a InnoDB
,
MySQL Server parsea la sintaxis de FOREIGN
KEY
en comandos CREATE TABLE
,
pero no lo usa ni almacena. En el futuro, la implemantación
se extenderá para almacenar esta información en el fichero
de especificaciones de las tablas de forma que puedan
obtenerla mysqldump y ODBC. En una etapa
posterior, restricciones de claves foráneas se implementarán
para tablas MyISAM
.
Restricciones de claves foráneas ofrecen distintos beneficios a los diseñadores de bases de datos:
Suponiendo un diseño adecuado de las relaciones, las restricciones de claves foráneas hacen más difícil que un programador introduzca inconsistencias en la base de datos.
Chequeo centralizado de restricciones por el servidor de base de datos hace que sea innecesario realizar esos chequeos en la parte de la aplicación, eliminando la posibilidad que distintas aplicaciones puedan no chequear todas las restricciones de la misma forma.
Usando actualizaciones y borrados en cascada puede simplificarse el código de aplicación.
Reglas diseñadas correctamente para claves foráneas pueden ayudar a documentar las relaciones entre tablas.
Tenga en cuenta que estos beneficios tienen el coste de un trabajo adicional para el servidor de base de datos para poder realizar todas las comprobaciones necesarias. Chequeos adicionales por parte del servidor afectan al rendimiento, lo que puede ser lo suficientemente malo para algunas aplicaciones como para evitarlo todo lo posible. (Algunas grandes aplicaciones comerciales han codificado la lógica de claves foráneas en el nivel de aplicación por esta razón.)
MySQL proporciona a diseñadores de bases de datos la
posibilidad de elegir qué paradigma elegir. Si no necesita
claves foráneas y quiere evitar la sobrecarga asociada con la
integridad referencial, puede usar otro tipo de tabla como
MyISAM
. (Por ejemplo, el motor
MyISAM
ofrece muy buen rendimiento para
aplicaciones que sólo realizan operaciones
INSERT
y SELECT
, ya que
las inserciones de pueden utilizar de forma concurrente con
consultas. Consulte Sección 7.3.2, “Cuestiones relacionadas con el bloqueo (locking) de tablas”.)
Si elige no utilizar integridad referencial, tenga en cuenta las siguientes consideraciones:
Sin un chequeo por parte del servidor de integridad referencial, la aplicación debe realizar este trabajo. Por ejemplo, debe tener cuidado de insertar registros en tablas en el orden apropiado, y evitar crear registros con hijos huérfanos. También debe ser capaz de recuperarse de errores que ocurran durante inserciones múltiples.
Si ON DELETE
es la única integridad
referencial que necesita la aplicación, desde la versión
4.0 de MySQL Server puede usar comandos
DELETE
para borrar registros de
distintas tablas con un único comando. Consulte
Sección 13.2.1, “Sintaxis de DELETE
”.
Una forma de suplir la falta de ON
DELETE
es añadir el comando
DELETE
apropiado a su aplicación
cuando borre registros de una tabla que no tenga clave
foránea. En la práctica, esto es tan rápido como usar
una clave foránea, y más portable.
Tenga en cuenta que el uso de claves foráneas puede provocar algunos problemas:
El soporte de claves foráneas arregla muchas cuestiones relacionadas con la integridad, pero todavía es necesario diseñar las claves cuidadosamente para evitar reglas circulares o combinaciones incorrectas de borrados en cascada.
Es posible crear una topología de relaciones que haga
difícil restaurar tablas individuales de una copia de
seguridad. (MySQL alivia esta dificultad permitiendo
desactivar claves foráneas temporalmente al recargar una
tabla que dependa de otras. Consulte
Sección 15.6.4, “Restricciones (constraints) FOREIGN KEY
”. Desde
MySQL 4.1.1, mysqldump genera ficheros
que utilizan esta características automáticamente al
recargarse.)
Tenga en cuenta que las claves foráneas en SQL se usan para
chequear y forzar integridad referencial, no para unir tablas.
Si quiere obtener resultados de múltiples tablas a partir de
un comando SELECT
, debe usar un join entre
ellas:
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
Consulte Sección 13.2.7.1, “Sintaxis de JOIN
”. Consulte
Sección 3.6.6, “Usar claves foráneas (foreign keys)”.
La sintaxis de FOREIGN KEY
sin ON
DELETE ...
se usa a menudo por aplicaciones ODBC
para producir cláusulas WHERE
automáticamente.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.