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
, CONSTRAINTinstance_ibfk_1
CLAVEmygroup
(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;
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:
- Eliminar restricciones
- Realizar TRUNCATE
- Eliminar manualmente las filas que ahora tienen referencias a ninguna parte
- 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:
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):Ejecute
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Esto eliminará la restricción de clave externa.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:
- Eliminar restricciones
- Realizar
TRUNCATE
- Eliminar manualmente las filas que ahora tienen referencias a ninguna parte
- 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