2011-09-24 32 views
9

我有三個表:類別,語言和categories_languages。 Categories_languages是多對多的表,它將類別和語言連接起來。我想更新表格語言中的foregin鍵值,但它會引發錯誤#1451 - 無法刪除或更新父行:外鍵約束失敗!如何更新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; 

這個錯誤對我來說很清楚,但是如何在這種情況下更新一個關鍵值?我嘗試添加ON 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; 

但也失敗消息:MySQL表示:#文檔1005 - 無法創建表 './db_dodo/#sql-c2f_80e6f.frm'(錯誤:121)

+0

什麼是更新查詢您正在運行產生的錯誤? – bobwienholt

回答

40

可以暫時停止外鍵檢查:

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; 

編輯:由於外鍵的問題:存儲在本地或遠程文件系統中的數據? errno 121是EREMOTEIO(遠程I/O錯誤)。目標文件系統上可能存在權限問題,或者它不支持文件名中的#字符?

+0

嘿謝謝。這幫助,我能夠更新表格!仍然不知道爲什麼我無法更改表約束來添加ON UPDATE CASCADE約束...?! –

+1

您應該先鎖定表格,然後解鎖它們,以防止在編輯過程中從其他會話無效插入。 –

0

如果你正在尋找一個臨時解決方案,您還可以更改ON UPDATE行動CASCADE和修改IDS