Warum funktioniert einABGESCHNITTENESfür mygroup
nicht? Obwohl ich ON DELETE CASCADE SET
habe, bekomme ich:
FEHLER 1701 (42000): Eine Tabelle, auf die in einer Fremdschlüsseleinschränkung verwiesen wird, kann nicht abgeschnitten werden (
mytest
.instance
, CONSTRAINTinstance_ibfk_1
FOREIGN KEY (GroupID
) REFERENCESmytest
.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;
Sie können keine TRUNCATE
-Tabelle verwenden, auf die FK-Einschränkungen angewendet werden (TRUNCATE
ist nicht identisch mit DELETE
).
Verwenden Sie eine dieser Lösungen, um dieses Problem zu umgehen. Beides birgt das Risiko einer Beschädigung der Datenintegrität.
Option 1:
TRUNCATE
durchführenOption 2: _ vorgeschlagen von user447951 in ihre Antwort
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
Ja, du kannst:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
Mit diesen Anweisungen riskieren Sie das Einfügen von Zeilen in Ihre Tabellen, die den FOREIGN KEY
-Einschränkungen nicht entsprechen.
Ich würde es einfach machen mit:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
Gemäß der Dokumentation in mysql kann TRUNCATE nicht für Tabellen mit Fremdschlüsselbeziehungen verwendet werden. Es gibt keine vollständige Alternative AFAIK.
Durch das Ablegen der Kontraintierung werden immer noch nicht ON DELETE und ON UPDATE ..__ aufgerufen.
Es scheint, dass TRUNCATE in MySQL noch keine vollständige Funktion ist (es ruft auch keine Trigger auf).Siehe Kommentar
du kannst tun
DELETE FROM `mytable` WHERE `id` > 0
Diese Frage wurde zwar vor mehr als 5 Jahren gestellt und ich weiß nicht, dass diese Einrichtung damals in MySql existierte. Wenn Sie jedoch phpmyadmin verwenden, können Sie einfach die Datenbank öffnen und dann die gewünschten Tabellen auswählen kürzen. Am unteren Rand befindet sich eine Dropdown-Liste mit vielen Optionen. Öffnen Sie es und wählen Sie die Option Empty unter der Überschrift Daten oder Tabelle löschen. Sie gelangen automatisch zur nächsten Seite, in der das Kontrollkästchen Fremdschlüsselprüfung aktivieren aktiviert ist. Heben Sie die Auswahl auf und klicken Sie auf die Schaltfläche Ja. Die ausgewählten Tabellen werden abgeschnitten. Möglicherweise führt er intern die in user447951s Antwort vorgeschlagene Abfrage aus. Es ist jedoch sehr praktisch, die phpmyadmin-Schnittstelle zu verwenden.
Die Antwort ist in der Tat die von zerkms bereitgestellte, wie in Option 1 angegeben:
Option 1: Die Datenintegrität darf nicht beschädigt werden:
- Einschränkungen entfernen
- TRUNCATE durchführen
- Löschen Sie manuell die Zeilen, die jetzt auf nirgendwo verweisen
- Erstellen Sie Einschränkungen
Der schwierige Teil ist Entfernen von Einschränkungen. Ich möchte Ihnen sagen, wie, falls jemand wissen muss, wie das geht:
Führen Sie die SHOW CREATE TABLE <Table Name>
-Abfrage aus, um den Namen Ihres FOREIGN KEY (roten Rahmen in dem Bild unten) zu ermitteln:
Führen Sie ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
aus. Dadurch wird die Fremdschlüsseleinschränkung entfernt.
Löschen Sie das zugehörige Index (durch die Tabellenstrukturseite), und Sie sind fertig.
fremdschlüssel neu erstellen:
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
Verwenden Sie einfach CASCADE
TRUNCATE "products" RESTART IDENTITY CASCADE;
Aber seien Sie bereit für Kaskadenlöschungen.
Wenn die Datenbank-Engine für Tabellen unterschiedlich ist, wird diese Fehlermeldung angezeigt
ALTER TABLE my_table ENGINE = InnoDB;
Der alte Status der Fremdschlüsselüberprüfung und der SQL-Modus sind der beste Weg, um die Tabelle zu kürzen/zu löschen, wie dies bei Mysql Workbench der Fall ist, während das Modell mit der Datenbank synchronisiert wird.
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;
SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;