Robiąc:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Błędy IT:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Oto moje tabele:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
Prostym sposobem byłoby wyłączenie sprawdzania klucza obcego; wprowadź zmiany, a następnie ponownie włącz sprawdzanie klucza obcego.
źródło
REPLACE INTO tab_with_constraint ...
Zgodnie z obecnym (prawdopodobnie wadliwym) projektem, musisz usunąć wiersz z tabeli reklamodawców, zanim będzie można usunąć wiersz z tabeli ofert pracy, do którego się on odnosi.
Alternatywnie możesz skonfigurować swój klucz obcy w taki sposób, aby usunięcie w tabeli nadrzędnej powodowało automatyczne usuwanie wierszy w tabelach podrzędnych. Nazywa się to usuwaniem kaskadowym. Wygląda mniej więcej tak:
Powiedziawszy to, jak inni już zauważyli, wydaje się, że twój klucz obcy powinien działać odwrotnie, ponieważ tabela reklamodawców naprawdę zawiera klucz podstawowy, a tabela ofert pracy zawiera klucz obcy. Przepisałbym to tak:
Kaskadowe usuwanie nie będzie konieczne.
źródło
Jeśli chcesz usunąć tabelę, wykonaj następujące zapytanie w jednym kroku
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE nazwa_tabeli;
źródło
Wypróbowałem rozwiązanie wspomniane przez @Alino Manzi, ale nie działało ono dla mnie na tabelach związanych z WordPressem przy użyciu wpdb.
potem zmodyfikowałem kod jak poniżej i zadziałało
źródło
Myślę, że twój klucz obcy jest odwrócony. Próbować:
źródło
Jeśli istnieje więcej niż jedna oferta pracy z tym samym identyfikatorem reklamodawcy, klucz obcy powinien mieć postać:
W przeciwnym razie (jeśli w Twoim przypadku jest odwrotnie), jeśli chcesz, aby wiersze w reklamodawcy były automatycznie usuwane, jeśli wiersz w zadaniu zostanie usunięty, dodaj opcję „USUŃ KASKADĘ” na końcu klucza obcego:
Sprawdź ograniczenia klucza obcego
źródło
Musisz go usunąć według kolejności. W tabelach występują zależności
źródło
Podczas tworzenia bazy danych lub tworzenia tabel
Należy dodać tę linię u góry skryptu tworzącego bazę danych lub tabelę
Teraz chcesz usunąć rekordy z tabeli? wtedy piszesz jako
Powodzenia!
źródło
A co z tą alternatywą, której używałem: pozwól, aby klucz obcy miał wartość NULL, a następnie wybierz ON DELETE SET NULL .
Osobiście wolę używać zarówno opcji „ ON UPDATE CASCADE ”, jak i „ ON DELETE SET NULL ”, aby uniknąć niepotrzebnych komplikacji, ale w konfiguracji możesz chcieć innego podejścia. Ponadto zerowanie wartości klucza obcego może prowadzić do komplikacji, ponieważ nie będziesz wiedział, co dokładnie się tam wydarzyło. Więc ta zmiana powinna być ściśle związana z działaniem kodu aplikacji.
Mam nadzieję że to pomoże.
źródło
Miałem ten problem w migracji laravel zbyt
Kolejność tabel spadek w dół () metoda ma znaczenia
może nie działać, ale jeśli zmienisz kolejność, zadziała.
źródło
jeśli potrzebujesz jak najszybciej wesprzeć klienta, a nie masz do niego dostępu
aby można było wyłączyć integralność danych:
1) usuń klucz obcy
2) aktywuj operację usuwania poprzez sql lub api
3) dodaj klucz obcy z powrotem do schematu
jest to jednak poprawka, więc robisz to na własne ryzyko, ponieważ główną wadą takiego podejścia jest to, że później trzeba ręcznie zachować integralność danych.
źródło
Możesz utworzyć wyzwalacz, aby usunąć odnośne wiersze przed usunięciem zadania.
źródło
Główny problem z tym błędem
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
polega na tym, że nie informuje on, która tabela zawiera błąd FK, więc trudno jest rozwiązać konflikt.Jeśli korzystasz z MySQL lub podobnego, dowiedziałem się, że możesz utworzyć diagram ER dla swojej bazy danych, a następnie przejrzeć i bezpiecznie usunąć wszelkie konflikty powodujące błąd.
connection
database
itables
sprawdzićźródło
Zasadniczo powodem tego typu błędów jest to, że ostatecznie próbujesz usunąć krotkę, która ma klucz podstawowy (tabela główna) i ten klucz podstawowy jest używany w tabeli podrzędnej jako klucz obcy. W tym scenariuszu, aby usunąć dane tabeli nadrzędnej, musisz usunąć dane tabeli podrzędnej (w której używany jest klucz obcy). Dzięki
źródło
Zdarzyło mi się to również i ze względu na zależność i odniesienie z innych tabel nie mogłem usunąć wpisu. To, co zrobiłem, to dodanie kolumny usuwania (typu boolean) do tabeli. Wartość w tym polu wskazywała, czy element jest oznaczony do usunięcia, czy nie. Jeśli zaznaczono do usunięcia, nie pobieraj / nie używaj; w przeciwnym razie użyj go.
źródło
Może powinieneś spróbować ON DELETE CASCADE
źródło