it-swarm.com.de

Wie schneide ich eine Tabelle mit Fremdschlüsseleinschränkungen ab?

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, CONSTRAINT instance_ibfk_1 FOREIGN KEY (GroupID) REFERENCES 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;
558
user391986

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:

  1. Einschränkungen entfernen
  2. TRUNCATE durchführen
  3. Löschen Sie manuell die Zeilen, die jetzt Verweise auf nowhere enthalten.
  4. Erstellen Sie Einschränkungen

Option 2: _ ​​vorgeschlagen von user447951 in ihre Antwort

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

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.

1165
user447951

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.

  • alle Zeilen löschen, Fremdschlüssel löschen, Schlüssel abschneiden, 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

11
Omer Sabic

du kannst tun

DELETE FROM `mytable` WHERE `id` > 0
10
Ali Sadran

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.

6
Rolen Koh

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:

  1. Einschränkungen entfernen
  2. TRUNCATE durchführen
  3. Löschen Sie manuell die Zeilen, die jetzt auf nirgendwo verweisen
  4. 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:

  1. 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:

     enter image description here

  2. Führen Sie ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> aus. Dadurch wird die Fremdschlüsseleinschränkung entfernt.

  3. 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>);
3
Trix

Verwenden Sie einfach CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

Aber seien Sie bereit für Kaskadenlöschungen.

1
Alexus1024

Einfach, wenn Sie phpMyAdmin verwenden.

Deaktivieren Sie einfach die Option Enable foreign key checks unter SQL und führen Sie TRUNCATE <TABLE_NAME>

 enter image description here

1
Ajmal Salim

Wenn die Datenbank-Engine für Tabellen unterschiedlich ist, wird diese Fehlermeldung angezeigt

ALTER TABLE my_table ENGINE = InnoDB;
0
sajad abbasi

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;
0
Vijay Arun