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;

3voto

mwafi Punkte 3523

Eine weitere Abhilfe ist das Löschen aller Zeilen in der Tabelle und das Zurücksetzen der Auto-Inkrement-Spalten:

delete from table_name where 1

dann Ausführen:

ALTER TABLE table_name AUTO_INCREMENT = 1

2voto

Alexus1024 Punkte 417

Verwenden Sie einfach CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

Aber seien Sie auf Kaskadenlöschungen vorbereitet.)

1voto

HadiNiazi Punkte 1131

Wenn Sie Laravel-Migrationen verwenden, können Sie dies mit Hilfe von Fassadenhelfern tun

es vorziehen, Eloquent-Objekte zu verwenden, antworten Sie auf die "Eloquent"-Weise

 Schema::disableForeignKeyConstraints();
 Teacher::truncate();
 Schema::enableForeignKeyConstraints();

In Laravel 7 und 8, für die Kompatibilität über 4 Datenbanken (MySql, Postgres, SQLite und SqlServer) und kein Eloquent, können Sie verwenden:

Schema::disableForeignKeyConstraints();
    DB::table('teachers')->truncate();
Schema::enableForeignKeyConstraints();

0voto

Vijay Arun Punkte 416

Getting the old foreign key check state and sql mode are best way to truncate / Drop the table as Mysql Workbench do while synchronizing model to database.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

0voto

sajad abbasi Punkte 1792

Wenn die Datenbank-Engine für die Tabellen unterschiedlich ist, erhalten Sie diesen Fehler, also ändern Sie sie in InnoDB

ALTER TABLE my_table ENGINE = InnoDB;

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