Warum nicht ein TRUNCATE auf mygroup
Arbeit? Obwohl ich habe, ON DELETE CASCADE SET
bekomme ich:
ERROR 1701 (42000): kann eine Tabelle in einer Fremdschlüsselbedingung verwiesen gestutzt (
mytest
.instance
, Constraintinstance_ibfk_1
FOREIGN KEY (GroupID
) LITERATURmytest
.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
quelle
quelle
Ja, du kannst:
Mit diesen Anweisungen riskieren Sie, Zeilen in Ihre Tabellen aufzunehmen, die den
FOREIGN KEY
Einschränkungen nicht entsprechen.quelle
;
). Dies liegt daran, dass jeder neue Web-SQL-Aufruf denFOREIGN_KEY_CHECKS
Ich würde es einfach machen mit:
quelle
DELETE
die Leistung langsamer ist alsTRUNCATE
. Da diese Aktion jedoch normalerweise nur selten ausgeführt wird, spielt dies keine Rolle.DELETE
kann aber absolut brutal sein, wenn Sie zu viele Zeilen haben - da es die Protokolle trifft, währendTRUNCATE
nur die Daten herausgerissen werden. Kommt wirklich auf den Anwendungsfall an.error 1175: You are using safe update mode,...
Änderungslöschklausel gemeldet, umDELETE FROM mydb.mytable where id != 0
sie zu perfektionieren.du kannst tun
quelle
mytable
Wie pro mysql Dokumentation , TRUNCATE kann nicht auf Tabellen mit Fremdschlüsselbeziehungen verwendet werden. Es gibt keine vollständige Alternative AFAIK.
Wenn Sie den Contraint fallen lassen, werden ON DELETE und ON UPDATE immer noch nicht aufgerufen. Die einzige Lösung, an die ich am Geldautomaten denken kann, ist:
Es scheint, dass TRUNCATE in MySQL noch keine vollständige Funktion ist (es werden auch keine Trigger aufgerufen).Siehe Kommentarquelle
TRUNCATE
unvollständig ist - Abschneiden soll keine Trigger usw. aufrufen. Wenn dies der Fall wäre, wäre es genauso wieDELETE
! Es ist zeilenunabhängig und kann daher keine zeilenbezogenen Vorgänge ausführen (z. B. Aufrufen von Triggern oder Untersuchen von Fremdschlüsseln). Dies funktioniert in Oracle und SQL Server auf die gleiche Weise .Einfach, wenn Sie phpMyAdmin verwenden.
Deaktivieren Sie einfach die
Enable foreign key checks
Option unter derSQL
Registerkarte und führen Sie sie ausTRUNCATE <TABLE_NAME>
quelle
Während diese Frage gestellt wurde, wusste ich nichts darüber, aber jetzt, wenn Sie phpMyAdmin verwenden, können Sie einfach die Datenbank öffnen und die Tabelle (n) auswählen, die Sie abschneiden möchten.
Empty
Option unter der ÜberschriftDelete data or table
.Enable foreign key checks
. Deaktivieren Sie es einfach und drücken Sie dieYes
Taste. Die ausgewählten Tabellen werden abgeschnitten.Möglicherweise wird die in der Antwort von user447951 vorgeschlagene Abfrage intern ausgeführt, die Verwendung über die phpMyAdmin-Oberfläche ist jedoch sehr praktisch.
quelle
Getestet auf MYSQL-Datenbank
Lösung 1:
Lösung 2:
Das funktioniert bei mir. Ich hoffe, das wird dir auch helfen. Vielen Dank, dass Sie diese Frage gestellt haben.
quelle
Die Antwort ist in der Tat die von zerkms , wie in Option 1 angegeben :
Der schwierige Teil ist das Entfernen von Einschränkungen. Daher möchte ich Ihnen sagen, wie, falls jemand wissen muss, wie das geht:
Führen Sie eine
SHOW CREATE TABLE <Table Name>
Abfrage aus, um zu sehen, wie Ihr AUSLÄNDISCHER SCHLÜSSEL heißt (roter Rahmen im Bild unten):Ausführen
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Dadurch wird die Fremdschlüsseleinschränkung aufgehoben.Löschen Sie den zugehörigen Index (über die Tabellenstrukturseite), und fertig.
So erstellen Sie Fremdschlüssel neu:
quelle
Verwenden Sie einfach CASCADE
Aber sei bereit für Kaskadenlöschungen)
quelle
Wenn sich das Datenbankmodul für Tabellen unterscheidet, wird dieser Fehler angezeigt. Ändern Sie sie daher in InnoDB
quelle
Das Abrufen des alten Fremdschlüsselprüfstatus und des SQL-Modus ist der beste Weg, um die Tabelle wie bei MySQL Workbench beim Synchronisieren des Modells mit der Datenbank abzuschneiden / zu löschen.
quelle