todos - ¿Cuál es la mejor manera de vaciar una tabla MySQL autorreferencial?
vaciar tabla sql (6)
Tengo una tabla de MySQL autorreferencial con un parent_id recursivo:
CREATE TABLE `recursive` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) default NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `data_categorysource_parent_id` (`parent_id`),
CONSTRAINT `parent_id_refs_id_627b4293`
FOREIGN KEY (`parent_id`) REFERENCES `data_categorysource` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Durante las pruebas, quiero vaciarlo pero TRUNCATE falla:
TRUNCATE `recursive`
/* SQL Error: Cannot delete or update a parent row: a foreign key
constraint fails...
Actualmente tengo que eliminar manualmente todos los registros, comenzando en la parte inferior del árbol trabajando hacia arriba. Esto se vuelve oneroso incluso con árboles pequeños.
¿Hay una manera fácil de evitar esto? No puedo DROP
la tabla y volver a crearla fácilmente, ya que otras tablas hacen referencia a ella (ya las he truncado, por lo que no debería haber problemas de integridad de datos).
Bueno, podría agregar FOREIGN KEY
ON DELETE CASCADE
a la definición de FOREIGN KEY
EXTRAÑA ... al menos temporalmente. Eso le permitiría truncar la tabla eliminando primero las filas a las que se hace referencia.
También hay otros tipos ON DELETE
; el valor predeterminado es ON DELETE NO ACTION
.
O simplemente elimine la restricción de la clave foránea (recursiva), luego trunca la tabla y luego vuelva a agregar el contraint.
Por qué no:
UPDATE ''recursive'' SET ''parent_id'' = NULL WHERE ''parent_id'' IS NOT NULL;
DELETE FROM ''recursive'';
?
Seleccione repetidamente las filas que no aparecen como padres y elimínelas, hasta que la tabla esté vacía. (Suponiendo que no hay ciclos ...)
Si solo desea vaciar todo el material para realizar pruebas, utilice:
SET FOREIGN_KEY_CHECKS = 0;
// Execute Query
SET FOREIGN_KEY_CHECKS = 1;
Esto omite totalmente cualquier verificación de clave externa.
eliminar de la tabla_1 donde fecha (tabla_1_TIME) <(seleccione T.t_Date from (seleccione max (fecha (table_1_TIME)) como t_Date from table_1) como T)