web-dev-qa-db-fra.com

Comment tronquer une table de clé étrangère contrainte?

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, 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;
537
user391986

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:

  1. Supprimer les contraintes
  2. Effectuer TRUNCATE
  3. Supprimer manuellement les lignes qui ont maintenant des références à nowhere
  4. Créer des contraintes

Option 2: _ ​​suggéré par user447951 dans leur réponse

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
795
zerkms

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.

1165
user447951

Je le ferais simplement avec:

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

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 à:

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

TRUNCATE dans MySQL n’est pas encore complet (il n’appelle pas non plus de déclencheurs). Voir le commentaire

11
Omer Sabic

tu peux faire

DELETE FROM `mytable` WHERE `id` > 0
10
Ali Sadran

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.

6
Rolen Koh

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:

  1. Supprimer les contraintes
  2. Effectuer TRUNCATE
  3. Supprimer manuellement les lignes qui ont maintenant des références à nulle part
  4. 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:

  1. 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):

     enter image description here

  2. Exécutez ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>. Cela supprimera la contrainte de clé étrangère.

  3. 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>);
3
Trix

Il suffit d'utiliser CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

Mais soyez prêt pour les suppressions en cascade)

1
Alexus1024

Facile si vous utilisez phpMyAdmin.

Décochez simplement l'option Enable foreign key checks sous l'onglet SQL et exécutez TRUNCATE <TABLE_NAME>

 enter image description here

1
Ajmal Salim

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;
0
sajad abbasi

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;
0
Vijay Arun