2010-03-12 18 views
31

Cuando ejecuto un comando mysqldump en mi base de datos y luego tratar de importarlo, fracasa en su intento de crear las tablas en orden alfabético, a pesar de que pueden tener una clave externa que hace referencia a una tabla más adelante en el archivo. No parece haber nada en el documentation y he encontrado respuestas como this que dicen para actualizar el archivo después de que se creó para incluir:¿Se puede crear automáticamente un archivo mysqldump que no aplique las restricciones de clave externa?

set FOREIGN_KEY_CHECKS = 0; 
...original mysqldump file contents... 
set FOREIGN_KEY_CHECKS = 1; 

¿No hay manera de ajustar automáticamente las líneas o exportar el tablas en el orden necesario (sin tener que especificar manualmente todos los nombres de tabla, ya que puede ser tedioso y propenso a errores)? Podría envolver esas líneas en un guión, pero me preguntaba si existe una manera fácil de garantizar que puedo volcar un archivo y luego importarlo sin actualizarlo manualmente.

Respuesta

39

El comando mysqldump incluido con MySQL 5.0.51 (y de acuerdo con las versiones de registro de cambios desde 4.1.1) desactiva las comprobaciones de claves externas. Por defecto, mysqldump incluye la siguiente línea en la parte superior del archivo de volcado:

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 

La sintaxis es una /*!40014 ... */conditional comment que se ejecutará en MySQL 4.0.14 y posteriores. La configuración de las antiguas claves externas se restablece al final del archivo de volcado:

/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
+2

Sí, veo que en el archivo. Otra persona que intentaba importar este archivo recibía un error en una línea de clave externa y pensaba que se debía al orden de creación. –

+5

¿Cómo ha respondido esto a la pregunta? Tai ha dicho que está recibiendo un error CON estos comentarios en el archivo, entonces, ¿cómo se ha resuelto el problema? – JoeTidee

26

Cuidado. Por algún motivo, mysqldump no escribe FOREIGN_KEY_CHECKS = 0 si se usa la opción --compact.

Ciao.

+3

La razón es que '' --compact' incluye --skip-comments' así que en vez '--compact' uno debe utilizar' --skip-add-drop-table --skip-add-cerraduras --skip-deshabilitar -keys --skip-set-charset' – iRonin

+2

En realidad, puedes omitir comentarios. El manual dice que --compact "permite al-add-drop-table --skip, --skip-add-cerraduras, --skip-comentarios, desactivar las teclas --skip-y --skip-set -charset options ", pero aparentemente --compact también elimina algún otro resultado además de eso - por ejemplo, las declaraciones FOREIGN_KEY_CHECKS. – dpi

9

Si está utilizando phpMyAdmin al exportar SQL, elija Método de exportación personalizado. Luego, entre las opciones de casilla de verificación, haga clic en "Desactivar verificación de clave externa". La instrucción SQL exportada tendrá la opción de desactivar y habilitar las comprobaciones de claves externas al principio y al final del archivo de salida, respectivamente.

No es "automático", pero no tendrá que escribir las declaraciones mismo para cada exportación.

+0

¡Guau! Un voto de abajo para sugerir una solución alternativa que funciona mucho más fácil que lo que se le preguntó – alds

+3

Eso es porque "mucho más fácil" es muy subjetiva (yo no es útil en absoluto, por ejemplo) y que en realidad no responde a la pregunta. – sehe

+2

+1 definitivamente útil para usuarios de PhpMyAdmin.Todos los demás pueden ignorarlo subjetivamente o rechazarlo subjetivamente :) – chim

6

Esto puede suceder si utiliza --compact como una de sus órdenes mysqldump. --compact incluye --skip-comments así que en vez --compact uno debe utilizar --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

Cuestiones relacionadas