update restriccion quitar llave foreign_key_checks foreign foraneas foranea fails ejemplo desactivar delete constraint claves clave cannot mysql sql django

restriccion - ¿Cómo deshabilitar temporalmente una restricción de clave externa en MySQL?



restriccion de llave foranea (11)

En lugar de deshabilitar su restricción, modifíquela permanentemente a ON DELETE SET NULL. Eso logrará algo similar y no tendría que activar y desactivar la verificación de claves. Al igual que:

ALTER TABLE tablename1 DROP FOREIGN KEY fk_name1; //get rid of current constraints ALTER TABLE tablename2 DROP FOREIGN KEY fk_name2; ALTER TABLE tablename1 ADD FOREIGN KEY (table2_id) REFERENCES table2(id) ON DELETE SET NULL //add back constraint ALTER TABLE tablename2 ADD FOREIGN KEY (table1_id) REFERENCES table1(id) ON DELETE SET NULL //add back other constraint

Lea esto ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) y este ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html ).

¿Es posible desactivar temporalmente las restricciones en MySQL?

Tengo dos modelos Django, cada uno con una ForeignKey a la otra. La eliminación de instancias de un modelo devuelve un error debido a la restricción ForeignKey:

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n) transaction.commit_unless_managed() #a foreign key constraint fails here cursor.execute("DELETE FROM myapp_style WHERE n = %s", n) transaction.commit_unless_managed()

¿Es posible desactivar temporalmente las restricciones y eliminar de todos modos?


En phpMyAdmin puede seleccionar varias filas y luego hacer clic en la acción de eliminar. Ingresará una pantalla que enumera las consultas de eliminación, puede desmarcar la verificación de la clave externa y hacer clic en Sí para ejecutarlas.

Esto le permitirá eliminar filas incluso si hay una restricción de restricción ON DELETE.


Intente DISABLE KEYS o

SET FOREIGN_KEY_CHECKS=0;

asegurate que

SET FOREIGN_KEY_CHECKS=1;

después.


No es una buena idea establecer una restricción de clave foránea en 0, porque si lo hace, su base de datos no asegurará que no esté violando la integridad referencial. Esto podría llevar a datos inexactos, engañosos o incompletos.

Usted crea una clave externa por una razón: porque todos los valores en la columna secundaria serán los mismos que un valor en la columna principal. Si no hay restricciones de clave externa, una fila secundaria puede tener un valor que no se encuentra en la fila principal, lo que llevaría a datos inexactos.

Por ejemplo, supongamos que tiene un sitio web para que los estudiantes inicien sesión y cada estudiante debe registrarse para obtener una cuenta como usuario. Tiene una tabla para los identificadores de usuario, con el identificador de usuario como clave principal; y otra tabla para las cuentas de los estudiantes, con la identificación del estudiante como una columna. Dado que cada estudiante debe tener una identificación de usuario, tendría sentido hacer que la identificación de la tabla de cuentas de estudiantes sea una clave externa que haga referencia a la identificación de usuario de la clave principal en la tabla de identificaciones de usuario. Si no hay controles de clave externa, un estudiante podría terminar teniendo una identificación de estudiante y no una identificación de usuario, lo que significa que un estudiante puede obtener una cuenta sin ser un usuario, lo cual es incorrecto.

Imagínese si le sucede a una gran cantidad de datos. Es por eso que necesita la verificación de clave externa.

Es mejor averiguar qué está causando el error. Lo más probable es que esté intentando eliminar de una fila principal sin eliminar de una fila secundaria. Intente eliminar de la fila secundaria antes de eliminar de la fila principal.


Normalmente, solo deshabilito las restricciones de clave externa cuando quiero truncar una tabla, y como vuelvo a esta respuesta, esto es para mí en el futuro:

SET FOREIGN_KEY_CHECKS=0; TRUNCATE TABLE table; SET FOREIGN_KEY_CHECKS=1;


Para desactivar globalmente la restricción de clave externa, haga lo siguiente:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

y recuerda volver a ponerlo cuando termines

SET GLOBAL FOREIGN_KEY_CHECKS=1;

ADVERTENCIA: Solo debe hacer esto cuando esté realizando el mantenimiento en modo de usuario único. Como podría dar lugar a la inconsistencia de los datos. Por ejemplo, será muy útil cuando esté cargando una gran cantidad de datos utilizando una salida mysqldump.


Para desactivar globalmente la restricción de clave externa:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

y para la restricción de clave externa activa

SET GLOBAL FOREIGN_KEY_CHECKS = 1;


Para deshabilitar: SET GLOBAL FOREIGN_KEY_CHECKS = 0;

Para habilitar: SET GLOBAL FOREIGN_KEY_CHECKS = 1;


Para mí, simplemente SET FOREIGN_KEY_CHECKS=0; no fue suficiente Todavía tenía una com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException .

Tuve que agregar ALTER TABLE myTable DISABLE KEYS; .

Asi que:

SET FOREIGN_KEY_CHECKS=0; ALTER TABLE myTable DISABLE KEYS; DELETE FROM myTable; ALTER TABLE myTable ENABLE KEYS; SET FOREIGN_KEY_CHECKS=1;


Si el campo de clave es anulable, también puede establecer el valor en nulo antes de intentar eliminarlo:

cursor.execute("UPDATE myapp_item SET myapp_style_id = NULL WHERE n = %s", n) transaction.commit_unless_managed() cursor.execute("UPDATE myapp_style SET myapp_item_id = NULL WHERE n = %s", n) transaction.commit_unless_managed() cursor.execute("DELETE FROM myapp_item WHERE n = %s", n) transaction.commit_unless_managed() cursor.execute("DELETE FROM myapp_style WHERE n = %s", n) transaction.commit_unless_managed()


Una solución muy simple con phpmyadmin: en su tabla, vaya a la pestaña SQL, después de editar el comando SQL que desea ejecutar, al lado de GO hay una casilla de verificación ''Habilitar verificación de claves foráneas''. Desactive esta casilla de verificación y ejecute su SQL Entonces será revisado automáticamente.