¿Cómo truncar una tabla restringida de clave foránea?


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

ERROR 1701 (42000): No se puede truncar una tabla referenciada en una restricción de clave foránea (mytest.instance, CONSTRAINT instance_ibfk_1 FOREIGN KEY (GroupID) REFERENCES 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;
Author: Waqleh, 2011-03-28

9 answers

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

Para solucionar 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. Elimine manualmente las filas que ahora tienen referencias a en ninguna parte
  4. Crear restricciones

Opción 2: sugerido por user447951{[11] {} en[31]}su respuesta

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
 720
Author: zerkms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 04:29:13

Sí puedes:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

Con estas instrucciones, corre el riesgo de dejar entrar filas en sus tablas que no se adhieran a las restricciones FOREIGN KEY.

 1113
Author: user447951,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-29 05:37:32

Simplemente lo haría con:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
 121
Author: George Garchagudashvili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-29 05:36:47

Según la documentación de mysql, TRUNCATE no se puede usar en tablas con relaciones de clave foránea. No hay una alternativa completa AFAIK.

Dejar caer la contraint todavía no invoca el ON DELETE y ON UPDATE. La única solución que puedo ATM pensar es:

  • eliminar todas las filas, soltar las claves foráneas, truncar, volver a crear claves
  • eliminar todas las filas, restablecer auto_increment (si se usa)

Parecería TRUNCADO en MySQL no es un completo característica todavía (tampoco invoca disparadores). Véase el comentario

 10
Author: Omer Sabic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-09 14:25:15

Puedes hacer

DELETE FROM `mytable` WHERE `id` > 0
 10
Author: Ali Sadran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-13 13:20:27

Si bien esta pregunta se hizo hace más de 5 años y no se que esta facilidad existiera en MySQL en ese entonces, 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 desplegable con muchas opciones enumeradas. Ábrelo y selecciona Empty opción bajo el encabezado Delete data or table . Te lleva a la siguiente página automáticamente donde hay una opción en la casilla de verificación llamada Habilitar extranjero chequeos de llaves. 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 de user447951. Pero es muy conveniente de usar desde la interfaz phpmyadmin.

 6
Author: Rolen Koh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 03:47:14

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

Opción 1 : que no puede dañar la integridad de los datos:

  1. Eliminar restricciones
  2. Realizar TRUNCAR
  3. Elimine manualmente las filas que ahora tienen referencias a nowhere
  4. Crear restricciones

La parte difícil es Eliminar restricciones , así que quiero decirte cómo, en caso de alguien necesita saber cómo hacer eso:

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

    introduzca la descripción de la imagen aquí

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

  3. Suelte el Índice asociado (a través de la página estructura de la tabla), y habrá terminado.

Para volver a crear claves foráneas:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
 3
Author: Trix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 10:18:25

Obtener el antiguo estado de comprobación de la clave externa y el modo sql son la mejor manera de truncar / Soltar la tabla como lo hace Mysql Workbench mientras 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;
 0
Author: Vijay Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 19:02:25

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

ALTER TABLE my_table ENGINE = InnoDB;
 0
Author: sajad abasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-20 21:14:36