2011-09-24 12 views
9

Mam trzy tabele: kategorie, języki i categories_languages. Kategorie_języka to wiele tabel, które łączą kategorie i języki. Chciałbym zaktualizować wartość klucza foregin w językach tabeli, ale powoduje to błąd nr 1451 - Nie można usunąć lub zaktualizować wiersza nadrzędnego: ograniczenie klucza obcego kończy się niepowodzeniem!Jak zaktualizować klucz obcy w bazie danych mysql

CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `name` varchar(20) NOT NULL, 
    `modified` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `languages` (
    `id` char(2) NOT NULL, 
    `name` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `categories_languages` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `category_id` int(11) unsigned NOT NULL, 
    `language_id` char(2) NOT NULL, 
    `translation` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_category_id_language_id` (`category_id`,`language_id`), 
    KEY `fk_language_id` (`language_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE; 

Błąd jest dla mnie jasny, ale w jaki sposób mogę zaktualizować wartość klucza w tym przypadku? Próbowałem dodając UPDATA CASCADE:

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

ale również kończy się niepowodzeniem z komunikatem: MySQL powiedział: Dokumentacja # 1005 - Nie można utworzyć tabeli './db_dodo/#sql-c2f_80e6f.frm' (errno: 121)

+0

Co jest kwerenda aktualizująca używasz, który generuje błąd? – bobwienholt

Odpowiedz

40

można tymczasowo zawiesić sprawdzanie klucza obcego:

SET foreign_key_checks = 0; 
UPDATE languages SET id='xyz' WHERE id='abc'; 
UPDATE categories_languages SET language_id='xyz' WHERE language_id='abc'; 
SET foreign_key_checks = 1; 

EDIT: Co do problemu klucza obcego: czy dane przechowywane na lokalnym lub zdalnym systemie plików? errno 121 to EREMOTEIO (Błąd zdalnego wejścia/wyjścia). Być może w docelowym systemie plików występują problemy z uprawnieniami lub nie obsługuje znaków # w nazwach plików?

+0

Hej dzięki. To pomogło, udało mi się zaktualizować tabele! Nadal nie wiem, dlaczego nie jestem w stanie zmienić ograniczenia tabeli, aby dodać ograniczenia AKTUALIZACJI NA ZAKUPY ...?! –

+1

Powinieneś ZABLOKUĆ tabele przed i ODBLOKOWAĆ je, aby zapobiec nieprawidłowym wstawkom z innej sesji podczas edycji. –

0

Jeśli szukasz rozwiązania temp można również zmienić działanie ON UPDATE do CASCADE i modyfikacji identyfikatory