restricción - quitar restriccion foreign key mysql
Deshabilitar las comprobaciones de claves externas en la línea de comando (4)
Tengo un script de respaldo para mi base de datos MySQL, usando mysqldump
con la opción --tab
para que produzca un archivo .sql
para la estructura y un archivo .txt
(separado por --tab
) para el contenido.
Algunas tablas tienen claves foráneas, así que cuando las importo obtengo el error:
ERROR 1217 (23000) en la línea 8: No se puede eliminar o actualizar una fila primaria: falla una restricción de clave externa
Sé sobre usar SET FOREIGN_KEY_CHECKS=0
(y SET FOREIGN_KEY_CHECKS=1
después). Si los agrego a cada archivo .sql
, la importación funciona. Pero obviamente, en el próximo mysqldump
los sobrescriben.
También intenté ejecutarlo como un comando separado, como a continuación, pero el error vuelve:
echo "SET FOREIGN_KEY_CHECKS=0" | mysql [user/pass/database]
[all the imports]
echo "SET FOREIGN_KEY_CHECKS=1" | mysql [user/pass/database]
¿Hay alguna otra forma de desactivar las comprobaciones FK en la línea de comando?
Ingresa a mysql:
mysql -u <username> -p -h <host_name or ip>
A continuación, ejecute
1 SET FOREIGN_KEY_CHECKS=0;
2 SOURCE /pathToFile/backup.sql;
3 SET FOREIGN_KEY_CHECKS=1;
Puede hacer esto concatenando la cadena al archivo en línea. Estoy seguro de que hay una manera más fácil de concatenar cadenas y archivos, pero funciona.
cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql
No creo que deba volver a establecerlo en 1, ya que es solo una sesión.
Solo otro para hacer lo mismo:
{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
También puede usar el parámetro --init-command
del comando mysql
.
Es decir: mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...
mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...