827 Stimmen

Wie kann man eine fremdschlüsselbeschränkte Tabelle abschneiden?

Warum hat ein TRUNCATE sur mygroup arbeiten? Auch wenn ich ON DELETE CASCADE SET Ich verstehe:

FEHLER 1701 (42000): Eine Tabelle, auf die in einer Fremdschlüssel-Beschränkung verwiesen wird, kann nicht abgeschnitten werden ( mytest . instance CONSTRAINT instance_ibfk_1 FOREIGN KEY ( GroupID ) REFERENZEN 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;

1574voto

user447951 Punkte 14953

Ja, das können Sie:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

Mit diesen Anweisungen riskieren Sie, Zeilen in Ihre Tabellen zu lassen, die sich nicht an die FOREIGN KEY Sachzwänge.

1218voto

zerkms Punkte 239362

Sie können nicht TRUNCATE eine Tabelle, auf die FK-Beschränkungen angewendet werden ( TRUNCATE ist nicht dasselbe wie DELETE ).

Um dies zu umgehen, können Sie eine der folgenden Lösungen verwenden. Beide bergen das Risiko, die Datenintegrität zu beeinträchtigen.

Option 1:

  1. Beschränkungen entfernen
  2. Durchführen TRUNCATE
  3. Löschen Sie manuell die Zeilen, die jetzt Verweise auf Nirgendwo
  4. Zwänge erstellen

Option 2: vorgeschlagen von Benutzer447951 in ihre Antwort

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

232voto

Ich würde es einfach mit machen:

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

39voto

Ajmal Salim Punkte 3913

Einfach, wenn Sie phpMyAdmin verwenden.

Einfach abwählen Enable foreign key checks Option unter SQL Registerkarte und führen Sie TRUNCATE <TABLE_NAME>

enter image description here

34voto

Kamlesh Punkte 3690

Getestet auf MYSQL Datenbank

Lösung 1:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;

Lösung 2:

DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;

Das funktioniert bei mir. Ich hoffe, das hilft auch Ihnen. Danke, dass Sie diese Frage gestellt haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X