with una truncar tabla restricción referencia referenced puede llave hace forzar foreign foranea ella ejemplo constraint con cannot mysql foreign-keys constraints truncate dml

mysql - una - truncate table sql server ejemplo



¿Cómo truncar una tabla restringida de clave externa? (10)

¿Por qué no funciona un TRUNCATE en mygroup ? Aunque tengo ON DELETE CASCADE SET obtengo:

ERROR 1701 (42000): No se puede truncar una tabla a la que se hace referencia en una restricción de clave foránea ( mytest . instance , CONSTRAINT instance_ibfk_1 CLAVE mygroup ( ID ) mytest . mygroup ( ID ))

drop database mytest; create database mytest; use mytest; CREATE TABLE mygroup ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE=InnoDB; CREATE TABLE instance ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, GroupID INT NOT NULL, DateTime DATETIME DEFAULT NULL, FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE, UNIQUE(GroupID) ) ENGINE=InnoDB;


Fácil si estás usando phpMyAdmin.

Simplemente desmarque Enable foreign key checks opción Enable foreign key checks en la pestaña SQL y ejecute TRUNCATE <TABLE_NAME>


La respuesta es de hecho la proporcionada por zerkms , como se indica en la Opción 1 :

Opción 1 : que no corre el riesgo de dañar la integridad de los datos:

  1. Eliminar restricciones
  2. Realizar TRUNCATE
  3. Eliminar manualmente las filas que ahora tienen referencias a ninguna parte
  4. Crear restricciones

La parte difícil es eliminar las restricciones , así que quiero decirte cómo, en caso de que alguien necesite saber cómo hacerlo:

  1. Ejecute la consulta SHOW CREATE TABLE <Table Name> para ver cuál es el nombre de su LLAVE EXTRAÑA (marco rojo en la imagen de abajo):

  2. Ejecute ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> . Esto eliminará la restricción de clave externa.

  3. Quite el índice asociado (a través de la página de estructura de tabla), y listo.

Para volver a crear claves externas:

ALTER TABLE <Table Name> ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);


No puede TRUNCATE una tabla que tenga restricciones FK aplicadas ( TRUNCATE no es lo mismo que DELETE ).

Para evitar esto, utilice cualquiera de estas soluciones. Ambos presentan riesgos de dañar la integridad de los datos.

Opción 1:

  1. Eliminar restricciones
  2. Realizar TRUNCATE
  3. Eliminar manualmente las filas que ahora tienen referencias a ninguna parte
  4. Crear restricciones

Opción 2: sugerida por el usuario 447951 en su respuesta

SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table $table_name; SET FOREIGN_KEY_CHECKS = 1;


Obtener el estado de verificación de clave externa anterior y el modo sql son la mejor manera de truncar / soltar la tabla como lo hace Mysql Workbench mientras se sincroniza el modelo con la base de datos.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;` SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=''TRADITIONAL,ALLOW_INVALID_DATES''; DROP TABLE TABLE_NAME; TRUNCATE TABLE_NAME; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Sí tu puedes:

SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table1; TRUNCATE table2; SET FOREIGN_KEY_CHECKS = 1;

Con estas declaraciones, se arriesga a dejar filas en sus tablas que no se adhieran a las restricciones de FOREIGN KEY .


Según la documentación de mysql , TRUNCATE no se puede utilizar en tablas con relaciones de clave externa. No hay AFAIK alternativa completa.

Al soltar el contraint, aún no se invoca ON DELETE y ON UPDATE. La única solución que puedo pensar en ATM es:

  • eliminar todas las filas, eliminar las claves externas, truncar, volver a crear claves
  • eliminar todas las filas, restablecer auto_increment (si se usa)

Parece que TRUNCATE en MySQL aún no es una característica completa (tampoco invoca activadores). Ver comentario


Si bien esta pregunta se hizo hace más de 5 años y no sé, esta instalación existía en MySql en ese entonces, pero ahora, si usa phpmyadmin , simplemente puede abrir la base de datos y luego seleccionar la (s) tabla (s) que desea truncar. En la parte inferior hay un menú desplegable con muchas opciones enumeradas. Ábralo y seleccione la opción Vacío bajo el encabezado Eliminar datos o tabla . Lo lleva a la siguiente página automáticamente donde hay una opción en la casilla de verificación llamada Habilitar verificación de clave externa. Simplemente deseleccione y presione el botón Sí y las tablas seleccionadas se truncarán. Puede ser que ejecute internamente la consulta sugerida en la respuesta del usuario 447951. Pero es muy conveniente utilizar desde la interfaz phpmyadmin.


Si el motor de la base de datos para las tablas difiere, obtendrá este error, así que cámbielos a InnoDB

ALTER TABLE my_table ENGINE = InnoDB;


Simplemente lo haría con:

DELETE FROM mytest.instance; ALTER TABLE mytest.instance AUTO_INCREMENT = 1;


tu puedes hacer

DELETE FROM `mytable` WHERE `id` > 0