Pourquoi ne pas TRUNCATE sur le mygroup
travail? 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
, RÉFÉRENCES CONSTRAINTinstance_ibfk_1
FOREIGN KEY (GroupID
)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;
mysql
foreign-keys
constraints
truncate
dml
user391986
la source
la source
Oui, vous pouvez:
Avec ces instructions, vous risquez de laisser des lignes dans vos tables qui ne respectent pas les
FOREIGN KEY
contraintes.la source
;
). En effet, chaque nouvel appel Web SQL réinitialisera leFOREIGN_KEY_CHECKS
à 1.Je le ferais simplement avec:
la source
DELETE
performances sont plus lentes queTRUNCATE
. Mais comme cette action n'est généralement effectuée que rarement, cela n'a pas d'importance.DELETE
peut être absolument brutal si vous avez trop de lignes - car il frappe les journaux, alorsTRUNCATE
qu'il arrache simplement les données. Cela dépend vraiment du cas d'utilisation.error 1175: You are using safe update mode,...
modification de la clause de suppression pour laDELETE FROM mydb.mytable where id != 0
rendre parfaite.tu peux faire
la source
mytable
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 à l'AFAIK.
La suppression de la contraint n'invoque toujours pas ON DELETE et ON UPDATE. La seule solution à laquelle je puisse penser ATM est de:
Il semblerait que TRUNCATE dans MySQL ne soit pas encore une fonctionnalité complète (il n'invoque pas non plus de déclencheurs).Voir le commentairela source
TRUNCATE
étant incomplète - tronquer n'est pas censé invoquer des déclencheurs, etc. Si c'était le cas, ce serait la même chose queDELETE
! Il est indépendant de la ligne, il est donc incapable d'effectuer des opérations liées à la ligne (comme invoquer des déclencheurs ou examiner des clés étrangères). Il fonctionne de la même manière dans Oracle et Sql Server .Facile si vous utilisez phpMyAdmin.
Décochez simplement l'
Enable foreign key checks
option sous l'SQL
onglet et exécutezTRUNCATE <TABLE_NAME>
la source
Bien que cette question ait été posée, je n'en savais rien, mais maintenant, si vous utilisez phpMyAdmin, vous pouvez simplement ouvrir la base de données et sélectionner la ou les tables que vous souhaitez tronquer.
Empty
option sous le titreDelete data or table
.Enable foreign key checks
. Il suffit de la désélectionner et d'appuyer sur leYes
bouton et 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 user447951 , mais il est très pratique à utiliser à partir de l'interface phpMyAdmin.
la source
Testé sur la base de données MYSQL
Solution 1:
Solution 2:
Cela fonctionne pour moi. J'espère que cela vous aidera aussi. Merci d'avoir posé cette question.
la source
La réponse est en effet celle fournie par les zerkms , comme indiqué dans l' option 1 :
La partie délicate est la suppression des contraintes , donc je veux vous dire comment, au cas où quelqu'un aurait besoin de savoir comment faire:
Exécutez une
SHOW CREATE TABLE <Table Name>
requête pour voir quel est le nom de votre clé étrangère (cadre rouge dans l'image ci-dessous):Courez
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Cela supprimera la contrainte de clé étrangère.Supprimez l' index associé (via la page de structure de table) et vous avez terminé.
pour recréer des clés étrangères:
la source
Utilisez simplement CASCADE
Mais soyez prêt pour les suppressions en cascade)
la source
Si le moteur de base de données pour les tables diffère, vous obtiendrez cette erreur, remplacez-les par InnoDB
la source
Obtenir l'ancien état de vérification de la clé étrangère et le mode SQL est 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.
la source