Jak obcinać tabelę z kluczem obcym?

Dlaczego nie działa obcinanie na mygroup? Mimo że mam ON DELETE CASCADE SET dostaję:

Błąd 1701 (42000): nie można obciąć tabeli odwołującej się do ograniczenia klucza obcego (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;
Author: Waqleh, 2011-03-28

9 answers

Nie można TRUNCATE tabeli, która ma na niej ograniczenia FK (TRUNCATE nie jest taka sama jak DELETE).

Aby to obejść, użyj jednego z tych rozwiązań. W obu przypadkach istnieje ryzyko uszkodzenia integralności danych.

Opcja 1:

  1. Usuń ograniczenia
  2. wykonaj TRUNCATE
  3. Usuń ręcznie wiersze, które teraz mają odniesienia do nigdzie
  4. Utwórz ograniczenia

Opcja 2: zasugerowane przez user447951 in their answer

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
 720
Author: zerkms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 04:29:13

Yes you can:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

Z tymi instrukcjami ryzykujesz wpuszczenie wierszy do tabel, które nie są zgodne z ograniczeniami FOREIGN KEY.

 1113
Author: user447951,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 05:37:32

Po prostu bym to zrobił z :

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
 121
Author: George Garchagudashvili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 05:36:47

Zgodnie z Dokumentacja mysql , TRUNCATE nie może być używana w tabelach z relacjami z kluczami obcymi. Nie ma kompletnej alternatywy AFAIK.

Upuszczenie contraint nadal nie wywołuje on DELETE i on UPDATE. Jedyne rozwiązanie jakie mogę wymyślić to albo:

  • usuń wszystkie wiersze, upuść klucze obce, obcinaj, Odtwórz klucze
  • usuń wszystkie wiersze, Resetuj auto_increment (jeśli jest używany)

wydaje się, że TRUNCATE w MySQL nie jest kompletnym Funkcja jeszcze (nie wywołuje wyzwalaczy). Zobacz komentarz

 10
Author: Omer Sabic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-09 14:25:15

You can do

DELETE FROM `mytable` WHERE `id` > 0
 10
Author: Ali Sadran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-13 13:20:27

Podczas gdy to pytanie zostało zadane ponad 5 lat temu i nie wiem, czy ten obiekt istniał wtedy w MySql, ale teraz, jeśli używasz phpmyadmin , możesz po prostu otworzyć bazę danych, a następnie wybrać tabelę(y), którą chcesz obciąć. Na dole znajduje się lista rozwijana z wieloma opcjami. Otwórz go i wybierz opcję Empty w nagłówku Usuń dane lub tabelę . Automatycznie przechodzi do następnej strony, gdzie w polu wyboru znajduje się opcja Enable foreign sprawdzanie kluczy. Po prostu odznacz go i naciśnij przycisk Tak, a wybrana tabela(y) zostanie obcięta. Być może wewnętrznie uruchamia zapytanie zasugerowane w odpowiedzi user447951. Ale jest bardzo wygodny w użyciu z interfejsu phpmyadmin.

 6
Author: Rolen Koh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-12 03:47:14

Odpowiedź jest rzeczywiście Ta dostarczona przez zerkms, jak podano w opcji 1:

Opcja 1 : która nie grozi uszkodzeniem integralności danych:

  1. Usuń ograniczenia
  2. wykonaj TRUNCATE
  3. Usuń ręcznie wiersze, które teraz mają odniesienia do nigdzie
  4. Utwórz ograniczenia

Najtrudniejszą częścią jest usuwanie ograniczeń , więc chcę ci powiedzieć, jak, w przypadku ktoś musi wiedzieć jak to zrobić:

  1. Uruchom SHOW CREATE TABLE <Table Name> zapytanie, aby zobaczyć nazwę Twojego klucza obcego (czerwona ramka na poniższym obrazku):

    Tutaj wpisz opis obrazka

  2. Run ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>. Spowoduje to usunięcie ograniczenia klucza obcego.

  3. Upuść powiązany indeks (przez stronę struktury tabeli) i gotowe.

Aby odtworzyć klucze obce:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
 3
Author: Trix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 10:18:25

Uzyskanie stanu sprawdzania starego klucza obcego i trybu sql to najlepszy sposób na obcięcie / upuszczenie tabeli tak, jak robi to Mysql Workbench podczas synchronizacji modelu z bazą danych.

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;
 0
Author: Vijay Arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 19:02:25

Jeśli silnik bazy danych dla tabel różni się, pojawi się ten błąd, więc zmień je na InnoDB

ALTER TABLE my_table ENGINE = InnoDB;
 0
Author: sajad abasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 21:14:36