Pourquoi unNE TRONQUE-T-IL PASsur mygroup
ne fonctionne-t-il pas? Même si j'ai ON DELETE CASCADE SET
je reçois:
ERREUR 1701 (42000): Impossible de 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;
Vous ne pouvez pas TRUNCATE
une table ayant des contraintes FK appliquées (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:
TRUNCATE
Option 2: _ suggéré 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 instructions, vous risquez de laisser entrer dans vos tables des lignes qui ne respectent pas les contraintes FOREIGN KEY
.
Je le ferais simplement avec:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
Selon la documentation mysql , TRUNCATE ne peut pas être utilisé sur des tables avec des relations de clé étrangère. Il n'y a pas d'alternative complète autant que je sache.
La suppression de la contrainte n’invoque toujours pas les options ON DELETE et ON UPDATE . La seule solution à laquelle je peux penser de l’ATM consiste à:
TRUNCATE dans MySQL n’est pas encore complet (il n’appelle pas non plus de déclencheurs). Voir le commentaire
tu peux faire
DELETE FROM `mytable` WHERE `id` > 0
Alors que cette question avait été posée il y a plus de 5 ans et que je ne savais pas que cette installation existait déjà dans MySQL, à présent, si vous utilisez phpmyadmin, vous pouvez simplement ouvrir la base de données, puis sélectionner la ou les tables que vous souhaitez utiliser. tronquer. En bas se trouve un menu déroulant avec de nombreuses options répertoriées. Ouvrez-le et sélectionnez l’option Vider sous le titre Supprimer les données ou le tableau. Il vous amène automatiquement à la page suivante où il y a une option dans la case à cocher appelée Activer les vérifications de clé étrangère. Désélectionnez-la et appuyez sur le bouton Oui. La ou les tables sélectionnées seront tronquées. Peut-être qu'il exécute en interne la requête suggérée dans la réponse de l'utilisateur447951. Mais il est très pratique d’utiliser l’interface phpmyadmin.
La réponse est bien celle fournie par zerkms , comme indiqué dans Option 1:
Option 1: qui ne risque pas de porter atteinte à l'intégrité des données:
- Supprimer les contraintes
- Effectuer TRUNCATE
- Supprimer manuellement les lignes qui ont maintenant des références à nulle part
- Créer des contraintes
La partie délicate est Supprimer les contraintes, alors je veux vous dire comment, au cas où quelqu'un aurait besoin de savoir comment faire cela:
Exécutez la requête SHOW CREATE TABLE <Table Name>
pour voir quel est votre nom FOREIGN KEY (cadre rouge dans l'image ci-dessous):
Exécutez ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Cela supprimera la contrainte de clé étrangère.
Supprimez le Index associé (via la page de structure de tableau) et vous avez terminé.
pour recréer des clés étrangères:
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
Il suffit d'utiliser CASCADE
TRUNCATE "products" RESTART IDENTITY CASCADE;
Mais soyez prêt pour les suppressions en cascade)
Si le moteur de base de données pour les tables diffère, vous obtiendrez cette erreur. Changez-les donc en InnoDB.
ALTER TABLE my_table ENGINE = InnoDB;
Obtenir le vieil état de vérification de la clé étrangère et le mode SQL sont le meilleur moyen de tronquer/Supprimer la table comme le fait Mysql Workbench lors de la synchronisation du modèle avec 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;