¿Es posible deshabilitar temporalmente las restricciones en MySQL?
Tengo dos modelos de Django, cada uno con una ForeignKey para el otro. Eliminar 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?
ON DELETE SET NULL
? Eso lograría algo similar y no tendría que activar y desactivar la comprobación de claves.Respuestas:
Prueba
DISABLE KEYS
oasegurate que
después.
fuente
disable keys
para InnodbPara desactivar la restricción de clave externa globalmente, haga lo siguiente:
y recuerde volver a configurarlo cuando haya terminado
ADVERTENCIA: solo debe hacer esto cuando realice el mantenimiento en modo de usuario único. Como podría resultar en inconsistencia de datos. Por ejemplo, será muy útil cuando cargue una gran cantidad de datos utilizando una salida mysqldump.
fuente
SET FOREIGN_KEY_CHECKS
cambia el valor de la conexión actual , mientras queSET GLOBAL ..
cambia el valor de todas las conexiones , incluidas las futuras. Si solo lo haceSET FOREIGN..
en una ventana, intente aplicar la declaración en una ventana diferente (a través de una conexión diferente), el valor no ha cambiado allí. ConGLOBAL
, la misma variable tiene el mismo valor para ambas conexiones.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
Normalmente solo deshabilito las restricciones de clave externa cuando quiero truncar una tabla, y dado que vuelvo a esta respuesta, esto es para mí en el futuro:
fuente
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 comprobación de claves. Al igual que:
Lea esto ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) y esto ( http://dev.mysql.com/doc/refman/5.5/en /create-table-foreign-keys.html ).
fuente
FOREIGN_KEY_CHECKS
en 0 y volver a colocarlo una vez que se realiza el trabajo sucio. Además, podría bloquearse para escribir sus tablas.Para desactivar la restricción de clave externa a nivel mundial:
y para la restricción de clave externa activa
fuente
Una solución muy simple con phpmyadmin:
fuente
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
no funcionó para mí en PHPMyAdmin porque olvidé desmarcar la casilla de verificación 'Habilitar comprobaciones de clave externa'. En PHPMyAdmin puede omitir estos comandos SET y simplemente desmarcar la casilla de verificación.Para mí simplemente
SET FOREIGN_KEY_CHECKS=0;
no fue suficiente. Todavía estaba teniendo uncom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Tuve que agregar
ALTER TABLE myTable DISABLE KEYS;
.Entonces:
fuente
Si el campo clave es anulable, también puede establecer el valor en nulo antes de intentar eliminarlo:
fuente
En phpMyAdmin puede seleccionar varias filas y luego hacer clic en la acción de eliminar. Ingresará a una pantalla que enumera las consultas de eliminación, puede desmarcar la verificación de 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.
fuente
No es una buena idea establecer una restricción de clave externa en 0, porque si lo hace, su base de datos no garantizaría que no esté violando la integridad referencial. Esto podría conducir a datos inexactos, engañosos o incompletos.
Usted crea una clave foránea por una razón: porque todos los valores en la columna secundaria serán los mismos que los valores en la columna primaria. Si no hay restricciones de clave externa, una fila secundaria puede tener un valor que no está en la fila principal, lo que conduciría a datos inexactos.
Por ejemplo, supongamos que tiene un sitio web para que los estudiantes inicien sesión y todos los estudiantes deben registrarse para obtener una cuenta como usuario. Tiene una tabla para identificadores de usuario, con ID de usuario como clave principal; y otra tabla para cuentas de estudiantes, con la identificación del estudiante como columna. Dado que cada estudiante debe tener una identificación de usuario, tendría sentido hacer que la identificación de estudiante 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 ID de usuario. Si no hay comprobaciones de claves externas, un estudiante podría terminar teniendo una identificación de estudiante y ninguna identificación de usuario, lo que significa que un estudiante puede obtener una cuenta sin ser un usuario, lo cual está mal.
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 primaria.
fuente