Otrzymuję ten komunikat o błędzie:
BŁĄD 1217 (23000) w wierszu 40: nie można usunąć ani zaktualizować wiersza nadrzędnego: nie powiodło się ograniczenie klucza obcego
... kiedy próbuję upuścić stół:
DROP TABLE IF EXISTS `area`;
... zdefiniowane w ten sposób:
CREATE TABLE `area` (
`area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
`nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
`descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`area_id`),
UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
Zabawne jest to, że porzuciłem już wszystkie inne tabele w schemacie, które mają klucze obce area
. W rzeczywistości baza danych jest pusta, z wyjątkiem area
tabeli.
Jak może mieć wiersze potomne, jeśli w bazie danych nie ma żadnego innego obiektu? O ile wiem, InnoDB nie zezwala na klucze obce w innych schematach, prawda?
(Mogę nawet uruchomić RENAME TABLE area TO something_else
polecenie: -?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
, tj. Brak nazwy schematu w odwołaniu do tabeli: -?Odpowiedzi:
Dwie możliwości:
Możesz zobaczyć, która to była tabela (a przynajmniej jedna z nich), wykonując polecenie „POKAŻ STATUS INNODB SILNIKA” po niepowodzeniu upuszczania.
Jeśli okaże się, że jest to drugi przypadek, zrzuciłbym i przywróciłbym cały serwer, jeśli możesz.
MySQL 5.1 i nowsze podają nazwę tabeli z FK w komunikacie o błędzie.
źródło
SHOW ENGINE INNODB STATUS
raporty.Na żądanie, teraz jako odpowiedź ...
Podczas korzystania z MySQL Query Browser lub phpMyAdmin wydaje się, że dla każdego zapytania otwierane jest nowe połączenie ( bugs.mysql.com/bug.php?id=8280 ), co sprawia, że konieczne jest zapisanie wszystkich instrukcji drop w jednym zapytaniu, np.
Gdzie
SET FOREIGN_KEY_CHECKS=1
służy jako dodatkowy środek bezpieczeństwa ...źródło
SET FOREIGN_KEY_CHECKS=0;
na początku zrzutu.Wyłącz sprawdzanie klucza obcego
źródło
SET FOREIGN_KEY_CHECKS=0
że jest to poprawne polecenie i naprawia komunikat o błędzie. Czy masz pojęcie, dlaczego jest to wymagane? Czy klucze obce są buforowane nawet po usunięciu tabel?SET FOREIGN_KEY_CHECKS=1;
po zakończeniu!SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1;
Gdzie SET FOREIGN_KEY_CHECKS = 1 służy jako dodatkowy środek bezpieczeństwa ...z tego bloga :
Możesz tymczasowo wyłączyć sprawdzanie kluczy obcych:
Po prostu pamiętaj, aby je przywrócić, gdy skończysz się bawić:
źródło
miejmy nadzieję, że to działa
SET Foreign_key_checks = 0; DROP TABLE
table name
; SET Foreign_key_checks = 1;źródło
Na Railsach można wykonać następujące czynności używając
rails console
:źródło
Być może wcześniej wystąpił błąd podczas pracy z tą tabelą. Możesz zmienić nazwę tabeli i spróbować ponownie ją usunąć.
źródło
Znalazłem proste rozwiązanie, wyeksportuj bazę danych, edytuj to, co chcesz edytować w edytorze tekstu, a następnie zaimportuj. Gotowe
źródło
CREATE TABLE
kodu i ponowne wczytanie zrzutu ... nie spowoduje usunięcia tabeli przez MySQL. A jeśli masz na myśli przywrócenie zrzutu w nowej bazie danych ... Jeśli chcesz wyczyścić wszystkie tabele, tak jak ja, nowo utworzona baza danych będzie już pusta. Jeśli chcesz zachować niektóre tabele,SET FOREIGN_KEY_CHECKS=0
obejście wymienione wszędzie tutaj działa dobrze i jest prostsze; i prawdopodobnie i tak nie musisz edytować zrzutu, ponieważ nowa kopia danych prawdopodobnie nie będzie miała niezsynchronizowanego słownika danych.Nie można usunąć ani zaktualizować wiersza nadrzędnego: ograniczenie klucza obcego nie powiodło się (
table1
.user_role
, OGRANICZANIEFK143BF46A8dsfsfds@#5A6BD60
KLUCZA OBCEGO (user_id
) REFERENCESuser
(id
))Co zrobiłem w dwóch prostych krokach. najpierw usuwam wiersz podrzędny w tabeli podrzędnej, np
mysql> usuń z tabeli 2, gdzie role_id = 2 && user_id = 20;
Zapytanie OK, dotyczy 1 wiersza (0,10 s)
a drugi krok to usunięcie rodzica
usuń z tabeli1, gdzie id = 20;
Zapytanie OK, dotyczy 1 wiersza (0,12 s)
W ten sposób rozwiązuję problem, który oznacza Usuń dziecko, a następnie Usuń rodzica
Mam nadzieję, że masz to. :)
źródło