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;

24voto

Ali Sadran Punkte 264

Können Sie tun

DELETE FROM `mytable` WHERE `id` > 0

14voto

Omer Sabic Punkte 704

Gemäß mysql-Dokumentation TRUNCATE kann nicht auf Tabellen mit Fremdschlüsselbeziehungen angewendet werden. AFAIK gibt es keine vollständige Alternative.

Die Aufhebung der Einschränkung führt immer noch nicht zum Aufruf von ON DELETE und ON UPDATE. Die einzige Lösung, die ich ATM denken kann, ist entweder zu:

  • alle Zeilen löschen, Fremdschlüssel löschen, trunkieren, Schlüssel neu erstellen
  • alle Zeilen löschen, auto_increment zurücksetzen (falls verwendet)

Es scheint, dass TRUNCATE in MySQL noch keine vollständige Funktion ist (es ruft auch keine Trigger auf). Siehe Kommentar

8voto

Rolen Koh Punkte 719

Während diese Frage gestellt wurde, wusste ich nichts davon, aber wenn Sie phpMyAdmin verwenden, können Sie einfach die Datenbank öffnen und die Tabelle(n) auswählen, die Sie abschneiden möchten.

  • Am unteren Rand befindet sich ein Dropdown-Menü mit vielen Optionen. Öffnen Sie es und wählen Sie Empty Option unter der Überschrift Delete data or table .
  • Sie werden automatisch auf die nächste Seite weitergeleitet, auf der es eine Option in einem Kontrollkästchen namens Enable foreign key checks . Heben Sie einfach die Markierung auf und drücken Sie die Yes und die ausgewählte(n) Tabelle(n) wird/werden abgeschnitten.

Vielleicht wird intern die Abfrage ausgeführt, die in user447951's Antwort aber es ist sehr bequem über die phpMyAdmin-Schnittstelle zu benutzen.

7voto

Pmpr.ir Punkte 16005

Die Antwort lautet in der Tat die von zerkms wie angegeben auf Option 1 :

Option 1 die die Integrität der Daten nicht gefährdet:

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

Der knifflige Teil ist Beseitigung von Beschränkungen Deshalb möchte ich Ihnen sagen, wie das geht, für den Fall, dass jemand wissen möchte, wie man das macht:

  1. ausführen. SHOW CREATE TABLE <Table Name> Abfrage, um zu sehen, was Ihr FOREIGN KEY Name (roter Rahmen im Bild unten):

    enter image description here

  2. ausführen. ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> . Dadurch wird die Fremdschlüssel-Beschränkung aufgehoben.

  3. Lassen Sie die zugehörige Index (über die Seite mit der Tabellenstruktur), und Sie sind fertig.

um Fremdschlüssel neu zu erstellen:

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

4voto

P.Githinji Punkte 1181

Wie kann man eine fremdschlüsselbeschränkte Tabelle abschneiden? In dieser Illustration wird gezeigt, wie man den Mysql-Fehler beim Abschneiden einer Tabelle mit Fremdschlüssel-Beschränkung löst. Wenn Sie PHPMYADMIN verwenden, ist es sehr einfach, eine Tabelle mit Fremdschlüssel-Beschränkung abzuschneiden.

  1. Melden Sie sich bei PHPMYADMIN an und klicken Sie auf die Tabelle, die Sie abschneiden möchten.
  2. Gehen Sie dann auf die Registerkarte SQL Platzieren Sie Ihren Code, um die Tabelle im SQL abzuschneiden Editor Beispiel truncate table students; Ersetzen Sie students durch den Namen der Tabelle.
  3. Deaktivieren Sie im unteren Teil des Editors das Kontrollkästchen "Fremdschlüsselprüfungen aktivieren", wie unten dargestellt:

enter image description here

Das funktioniert wie Zauberei.

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