751 votes

table contrainte tronquée de clé étrangère

Pourquoi un TRUNCATE sur mygroup fonctionne-t-il pas? Même si j'ai ON DELETE CASCADE SET j'ai:

ERREUR 1701 (42000): Impossible de tronquer une table référencée dans une contrainte de clé étrangère ( 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;
 

1410voto

user447951 Points 4806

Oui, vous pouvez:

 SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;
 

Avec ces instructions, vous risquez de laisser des lignes dans vos tables qui ne respectent pas les contraintes FOREIGN KEY .

1162voto

zerkms Points 105994

Vous ne pouvez pas TRUNCATE une table qui a FK contraintes appliquées sur elle (TRUNCATE n'est pas le même que DELETE).

Pour contourner:

Option 1: qui ne risque pas d'endommager l'intégrité des données:

  1. Supprimer les contraintes
  2. Effectuez TRUNCATE
  3. Supprimer manuellement les lignes qui ont maintenant des références à "nulle part"
  4. Créer des contraintes

Option 2: suggéré par user447951 dans sa réponse, ce qui est une mauvaise pratique. L'utiliser si vous êtes OK risquer de nuire à l'intégrité des données.

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table1; 
SET FOREIGN_KEY_CHECKS = 1;

204voto

Je le ferais simplement avec:

 DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
 

Et buvez du champagne sans risque

13voto

Omer Sabic Points 348

Conformément à la documentation de mysql, TRUNCATE ne peut pas être utilisé sur les tables avec les relations de clé étrangère. Il n'y a pas d'alternative complète autant que je sache.

Abandon de la contrainte n'est toujours pas invoquer la clause on DELETE et UPDATE. La seule solution que je peux ATM penser à est de, soit:

  • supprimer toutes les lignes, supprimer les clés étrangères, tronquer, de recréer les clés
  • supprimer toutes les lignes, réinitialiser auto_increment (si utilisé)

Il semblerait TRONQUER dans MySQL n'est pas un ensemble complet de fonctionnalités pour l'instant (elle n'a pas d'invoquer les déclencheurs).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X