Question Comment tronquer une table contrainte par une clé étrangère?


Pourquoi pas un TRONQUER sur mygroup travail? Même si j'ai ON DELETE CASCADE SET Je reçois:

ERROR 1701 (42000): impossible de tronquer une table référencée dans une contrainte de clé étrangère (mytest.instance, CONTRAINTE instance_ibfk_1 CLÉ ÉTRANGÈRE (GroupID) LES RÉFÉRENCES 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;

488
2018-03-27 21:57


origine


Réponses:


Vous ne pouvez pas TRUNCATE une table sur laquelle des contraintes FK sont 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'endommager 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 à nulle part
  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;

687
2018-03-27 22:03



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 tableaux qui ne respectent pas le FOREIGN KEY contraintes.


1076
2017-11-10 03:02



Je le ferais simplement avec:

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

120
2017-09-24 11:05



Selon 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 AFAIK.

La suppression de la contrainte n'appelle toujours pas ON DELETE et ON UPDATE. La seule solution à laquelle je puisse penser est de:

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

Il semblerait que TRUNCATE dans MySQL ne soit pas encore une fonctionnalité complète (elle n'invoque pas non plus les déclencheurs). Voir le commentaire


10
2017-10-16 09:20



tu peux faire

DELETE FROM `mytable` WHERE `id` > 0

8
2018-05-13 13:20



Alors que cette question a été posée il y a plus de 5 ans et que je ne connaissais pas cette fonctionnalité dans MySql à l'époque, mais maintenant si vous utilisez phpmyadmin vous pouvez simplement ouvrir la base de données, puis sélectionner la ou les tables que vous souhaitez tronquer. En bas, il y a un menu déroulant avec beaucoup d'options listées. Ouvrez-le et sélectionnez Vide option sous la rubrique Supprimer des données ou un tableau. Il vous amène automatiquement à la page suivante où il existe une option dans la case à cocher intitulée Activer les contrôles de clé étrangère. Désélectionnez-le et appuyez sur le bouton Oui pour que la ou les tables sélectionnées soient tronquées. 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 d'utiliser l'interface phpmyadmin.


5
2017-12-22 11:41



La réponse est en effet celui fourni par zerkms, comme indiqué sur 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, donc je veux vous dire comment, au cas où quelqu'un a besoin de savoir comment faire cela:

  1. Courir SHOW CREATE TABLE <Table Name> requête pour voir quelle est votre CLÉ ÉTRANGÈRENom de la personne (Cadre rouge dans l'image ci-dessous):

    enter image description here

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

  3. Déposez le associé Indice (à travers la page structure de la table), et vous avez terminé.

recréer des clés étrangères:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);

2
2017-11-24 19:15



Obtenir l'ancienne clé étrangère vérifier l'état et le mode sql est le meilleur moyen de tronquer / déposer 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;

0
2017-12-15 19:02