mostrar - on delete cascade mysql
En MySQL, ¿puedo diferir las verificaciones de integridad referencial hasta confirmar? (3)
Al igual que en esta pregunta , he estado leyendo PoEAA y me pregunto si es posible diferir las verificaciones de integridad referencial hasta confirmar en MySQL.
Me he encontrado con este problema al querer insertar un grupo de productos y productos relacionados en el mismo compromiso. Incluso dentro de una transacción, recibo errores de restricción cuando intento insertarlo en la tabla de combinación de productos relacionados.
Si ayuda, estoy usando PHP DOP para conexiones de base de datos.
Apreciaría cualquier ayuda que pudieras ofrecer.
Parece que mi respuesta está here ...
Al igual que MySQL en general, en una sentencia de SQL que inserta, elimina o actualiza muchas filas, InnoDB verifica las restricciones ÚNICA y FOREIGN KEY fila por fila. Al realizar verificaciones de clave externa, InnoDB establece bloqueos compartidos de filas en los registros primarios o secundarios que debe examinar. InnoDB comprueba las restricciones de clave externa de inmediato; el cheque no se aplaza al compromiso de transacción. De acuerdo con el estándar SQL, el comportamiento predeterminado debe ser la verificación diferida. Es decir, las restricciones solo se verifican después de que se haya procesado toda la instrucción SQL. Hasta que InnoDB implemente la verificación de restricciones diferidas, algunas cosas serán imposibles, como eliminar un registro que se refiera a sí mismo usando una clave externa.
De vuelta al tablero de dibujo.
Puede manejar esta limitación del motor de innodb, deshabilitando temporalmente las comprobaciones de clave externa configurando la variable del servidor:
set foreign_key_checks=0;
Desde el manual de MySQL:
mysqldump también produce definiciones correctas de tablas en el archivo de volcado, y no se olvida de las claves externas.
Para facilitar la recarga de los archivos de volcado para tablas que tienen relaciones de clave externa, mysqldump incluye automáticamente una declaración en la salida del volcado para establecer foreign_key_checks en 0. Esto evita problemas con las tablas que tienen que ser recargadas en un orden particular cuando se recarga el volcado. También es posible configurar esta variable manualmente:
mysql> SET foreign_key_checks = 0;
mysql> SOURCE dump_file_name;
mysql> SET foreign_key_checks = 1;
Si está preguntando si MySQL es compatible con el atributo DEFERRABLE
para las claves externas (incluida la opción INITIALLY DEFERRED
), la respuesta es un claro no.
No puede aplazar la comprobación de restricciones hasta que se confirme el tiempo en MySQL.
Y, como ya ha señalado, siempre se evalúan en "nivel de fila" y no en "nivel de instrucción".