tablas soporta segundo por para optimizar lentas grandes eficientes datos cuantas consultas con cantidades mysql foreign-keys innodb myisam

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 como user_address.user_id . Si elimina un usuario de forma user_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 como file.last_modified_by . Si elimina un usuario por file.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.