Comment tronquer une table à clé étrangère?
pourquoi un tronqué sur mygroup
ne fonctionne-t-il pas?
Même si j'ai ON DELETE CASCADE SET
je comprends:
ERREUR 1701 (42000): Ne peut pas tronquer une table référencée dans une contrainte de clé étrangère (
mytest
.instance
," CONSTRAINTinstance_ibfk_1
FOREIGN KEY (GroupID
) REFERENCESmytest
.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;
9 réponses
Vous ne pouvez pas TRUNCATE
une table qui a FK contraintes appliquées sur celui-ci ( TRUNCATE
n'est pas la même chose que DELETE
).
Pour contourner ce problème, utilisez l'une de ces solutions. Les deux présentent des risques d'atteinte à l'intégrité des données.
Option 1:
- supprimer les contraintes
- Exécuter
TRUNCATE
- Supprimer manuellement les lignes ont maintenant des références à nulle part
- créer des contraintes
Option 2: suggérée par user447951 dans leur réponse
"SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
Oui, vous pouvez:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
avec ces énoncés, vous risquez de laisser entrer des lignes dans vos tables qui n'adhèrent pas aux contraintes FOREIGN KEY
.
je le ferais simplement avec:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
comme pour documentation mysql , TRUNCATE ne peut pas être utilisé sur les tables avec des relations de clé étrangères. Il n'y a pas D'alternative complète AFAIK.
la suppression du contraint n'invoque toujours pas la suppression ON et la mise à jour. La seule solution à laquelle je ne peux pas penser est à l'un ou l'autre:
- supprimer toutes les lignes, laisser tomber les clés étrangères, tronquer, recréer les clés
- supprimer toutes les lignes, réinitialiser auto_ incrément (si utilisé)
il semblerait que Truncate dans MySQL n'est pas encore une fonctionnalité complète (il n'invoque pas non plus de déclencheurs).
Voir le commentaire
alors que cette question a été posée il y a plus de 5 ans et je ne sais pas si cette facilité existait dans MySql à l'époque, mais maintenant si vous utilisez phpmyadmin vous pouvez simplement ouvrir la base de données et ensuite sélectionner la table(s) que vous voulez tronquer. En bas il y a un drop down avec de nombreuses options énumérées. Ouvrez - le et sélectionnez l'option vide sous le titre supprimer les données ou le tableau . Il vous amène à la page suivante automatiquement où il y a une option dans la case Activer le contrôle des clefs étrangères. Juste décochez-la et appuyez sur le bouton Oui et la table sélectionnée(s) sera tronqué. Peut-être qu'il exécute en interne la requête suggérée dans la réponse de user447951. Mais il est très pratique à utiliser à partir de l'interface phpmyadmin.
la réponse est en effet celle fournie par zerkms , comme indiqué sur Option 1 :
Option 1 : qui ne risque pas d'endommager l'intégrité des données:
- supprimer les contraintes
- effectuer troncature
- supprimer manuellement les lignes qui ont références à nulle part
- créer des contraintes
la partie délicate est suppression des contraintes , donc je veux vous dire comment, au cas où quelqu'un a besoin de savoir comment faire cela:
-
Exécuter
SHOW CREATE TABLE <Table Name>
requête pour voir qu'est-ce que votre CLÉ ÉTRANGÈRE 's nom (cadre Rouge dans l'image ci-dessous): -
Exécuter
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Cela supprimera la contrainte de la clé étrangère. -
supprimez le Index (par la page de structure de tableau), et vous êtes fait.
pour re-créer des clés étrangères:
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
obtenir l'ancien état de vérification de clé étrangère et le mode sql sont la meilleure façon de tronquer / laisser tomber la table comme Mysql Workbench faire tout en synchronisant le modèle à la base de données.
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;
si le moteur de base de données pour les tables diffèrent, vous obtiendrez cette erreur alors changez-les en InnoDB
ALTER TABLE my_table ENGINE = InnoDB;