Dlaczego nie robi TRUNCATE na mygroup
pracę? Mimo że ON DELETE CASCADE SET
dostaję:
BŁĄD 1701 (42000): Nie można obciąć tabeli, do której odwołuje się ograniczenie klucza obcego (
mytest
.instance
, ODNIESIENIAinstance_ibfk_1
KLUCZA ZAGRANICZNEGO (GroupID
)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;
mysql
foreign-keys
constraints
truncate
dml
użytkownik391986
źródło
źródło
Tak, możesz:
Dzięki tym instrukcjom ryzykujesz wpuszczeniem wierszy do tabel, które nie są zgodne z
FOREIGN KEY
ograniczeniami.źródło
;
). Wynika to z faktu, że każde nowe wywołanie SQL WWW resetujeFOREIGN_KEY_CHECKS
do 1.Po prostu zrobiłbym to z:
źródło
DELETE
działa wolniej niżTRUNCATE
. Ale ponieważ ta czynność jest zwykle wykonywana rzadko, nie ma to znaczenia.DELETE
może być absolutnie brutalne, jeśli masz zbyt wiele wierszy - ponieważ uderza w dzienniki, aTRUNCATE
po prostu usuwa dane. Naprawdę zależy od przypadku użycia.error 1175: You are using safe update mode,...
zmianę klauzuli usuwania, abyDELETE FROM mydb.mytable where id != 0
było idealne.możesz to zrobić
źródło
mytable
Zgodnie z dokumentacją mysql , TRUNCATE nie może być stosowany w tabelach z relacjami klucza obcego. Nie ma pełnej alternatywnej AFAIK.
Usunięcie ograniczenia nadal nie wywołuje opcji ON DELETE i ON UPDATE. Jedyne rozwiązanie, jakie mogę wymyślić ATM, to:
Wydaje się, że TRUNCATE w MySQL nie jest jeszcze pełną funkcją (nie wywołuje też wyzwalaczy).Zobacz komentarzźródło
TRUNCATE
jest niekompletny - obcinanie nie powinno wywoływać wyzwalaczy itp. Gdyby tak było, byłoby to tak samo jakDELETE
! Jest niezależny od wiersza, dlatego nie może wykonywać operacji związanych z wierszami (takich jak wywoływanie wyzwalaczy lub sprawdzanie kluczy obcych). Działa w ten sam sposób w Oracle i Sql Server .Łatwe, jeśli używasz phpMyAdmin.
Po prostu odznacz
Enable foreign key checks
opcję wSQL
zakładce i uruchomTRUNCATE <TABLE_NAME>
źródło
Podczas gdy zadawano to pytanie, nie wiedziałem o tym, ale teraz, jeśli używasz phpMyAdmin, możesz po prostu otworzyć bazę danych i wybrać tabele, które chcesz obciąć.
Empty
opcję pod nagłówkiemDelete data or table
.Enable foreign key checks
. Po prostu usuń zaznaczenie i naciśnijYes
przycisk, a wybrane tabele zostaną obcięte.Może wewnętrznie uruchamia zapytanie sugerowane w odpowiedzi user447951 , ale jest bardzo wygodne w użyciu z interfejsu phpMyAdmin.
źródło
Testowane na bazie danych MYSQL
Rozwiązanie 1:
Rozwiązanie 2:
To działa dla mnie. Mam nadzieję, że ci to pomoże. Dzięki, że zadałeś to pytanie.
źródło
Odpowiedź jest rzeczywiście udzielona przez Zerkms , jak stwierdzono w Opcji 1 :
Trudna część polega na usuwaniu ograniczeń , więc chcę powiedzieć, jak to zrobić, na wypadek, gdyby ktoś musiał wiedzieć, jak to zrobić:
Uruchom
SHOW CREATE TABLE <Table Name>
zapytanie, aby zobaczyć, jak nazywa się KLUCZ ZAGRANICZNY (czerwona ramka na obrazku poniżej):Uruchom
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 ponownie utworzyć klucze obce:
źródło
Wystarczy użyć CASCADE
Ale bądź gotowy na usuwanie kaskadowe)
źródło
Jeśli silnik bazy danych dla tabel różni się, pojawi się ten błąd, więc zmień je na InnoDB
źródło
Uzyskiwanie starego stanu sprawdzania klucza obcego i trybu sql to najlepszy sposób na obcinanie / upuszczanie tabeli, tak jak robią to Mysql Workbench podczas synchronizacji modelu z bazą danych.
źródło