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
, CONSTRAINTinstance_ibfk_1
FOREIGN KEY (GroupID
) REFERENCESmytest
.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;
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:
- Usuń ograniczenia
- wykonaj
TRUNCATE
- Usuń ręcznie wiersze, które teraz mają odniesienia do nigdzie
- 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;
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
.
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;
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
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
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.
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:
- Usuń ograniczenia
- wykonaj TRUNCATE
- Usuń ręcznie wiersze, które teraz mają odniesienia do nigdzie
- Utwórz ograniczenia
Najtrudniejszą częścią jest usuwanie ograniczeń , więc chcę ci powiedzieć, jak, w przypadku ktoś musi wiedzieć jak to zrobić:
-
Uruchom
SHOW CREATE TABLE <Table Name>
zapytanie, aby zobaczyć nazwę Twojego klucza obcego (czerwona ramka na poniższym obrazku): Run
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Spowoduje to usunięcie ograniczenia klucza obcego.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>);
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;
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;
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