soporta - optimizar consultas mysql explain
¿Por qué usar claves externas sin acción al eliminar o actualizar? (2)
Creo que estás malinterpretando lo que significa ON DELETE NO ACTION
. No significa suprimir la restricción de clave foránea.
Cuando elimina un registro al que hace referencia una clave externa, InnoDB tiene la capacidad de realizar una acción automática para corregir la situación:
- Puede
CASCADE
, es decir, eliminar el registro de referencia. (Esto tendría sentido para algo comouser_address.user_id
. Si elimina un usuario de formauser_address.user_id
, es probable que también desee eliminar todas las direcciones de los usuarios). - Puede establecer
SET NULL
, es decir, borrar la clave de referencia. (Esto podría tener sentido para algo comofile.last_modified_by
. Si elimina un usuario porfile.last_modified_by
, es posible que desee que la última modificación del archivo se convierta simplemente en "desconocida").
Si no especifica NO ACTION
, le está diciendo a InnoDB que no desea que realice ninguna de estas acciones. Así que InnoDB no puede arreglar la situación por ti; todo lo que puede hacer es rechazar el DELETE
y devolver un error.
Como resultado, ON DELETE NO ACTION
es en realidad lo mismo que ON DELETE RESTRICT
(el valor predeterminado).
(Nota: en algunos DBMS, y en SQL estándar, ON DELETE NO ACTION
es un poco diferente de ON DELETE RESTRICT
: en esos, ON DELETE NO ACTION
significa "aceptar el DELETE
dentro de la transacción actual, pero rechazar la transacción completa si lo intento cometerlo antes de solucionar el problema ". Pero InnoDB no admite cheques diferidos, por lo que trata ON DELETE NO ACTION
exactamente igual que ON DELETE RESTRICT
, y siempre rechaza el DELETE
inmediatamente .)
Consulte §§ 14.2.2.5 "Restricciones de FOREIGN KEY" y 13.1.17.2 "Uso de restricciones de FOREIGN KEY" en el Manual de referencia de MySQL 5.6.
Tengo una pregunta de interés:
Tengo 2 tablas en mysql con InnoDb
.
la tabla tbl_a
tiene una clave principal, llamada a_id
;
la tabla tbl_b
tiene un b_id
primario y una clave externa en tbl_a.a_id
con " ON DELETE NO ACTION
".
+-------------+---------------+---------------+
| Table Name | Primary Key | Foreign Key |
+-------------+---------------+---------------+
| tbl_a | a_id | |
| tbl_b | b_id | a_id |
+-------------+---------------+---------------+
¿Por qué debería seguir usando InnoDb y las claves externas, si realmente no uso la magia de las claves externas al final?
¿Hay todavía un punto de uso?
innodb y llaves foráneas
en lugar de
myisam y sin llaves foráneas .
¿Si acabo de hacer " NO ACTION
" para eliminar o actualizar?
Espero que tengas mi punto de interés :)
La restricción de clave externa, incluso sin ON DELETE / UPDATE CASCADE
garantiza que si inserta un valor en la tabla secundaria, tenga un valor que coincida correctamente en la tabla principal (o es NULL
si la columna FK es anulable). Intentar insertar un valor no válido en la columna FK de la tabla secundaria daría como resultado un error cuando la restricción falla, por lo que su integridad de datos está protegida.
ERROR 1452 (23000): No se puede agregar o actualizar una fila secundaria: la restricción de una clave externa falla
La definición de la restricción de clave externa también define implícitamente un índice en la columna FK en la tabla secundaria, que aunque podría haber definido manualmente el índice, mejorará el rendimiento de la unión.
ON DELETE NO ACTION
(que es lo mismo que omitir la cláusula ON DELETE
) evitará activamente la eliminación de una fila principal si una tabla secundaria hace referencia a ella, no permite su eliminación pasiva sin afectar las filas secundarias.