2011-09-24 19 views
9

カテゴリ、言語、およびcategories_languagesの3つのテーブルがあります。 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; 

このエラーは明らかですが、この場合、キー値を更新するにはどうすればよいですか?

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; 

が、それはまた、メッセージで失敗します:私は、アップデータCASCADE ON追加しようとしたMySQLは言った:ドキュメント#1005は - テーブルを作成できません './db_dodo/#sql-c2f_80e6f.frm'(errnoに: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; 

EDIT:外部キーの問題については:データがローカルまたはリモートのファイルシステムに保存されているの? errno 121はEREMOTEIO(リモートI/Oエラー)です。おそらく、対象のファイルシステムに権限の問題があるか、またはファイル名に#文字をサポートしていない可能性がありますか?

+0

おかげで。これは、私はテーブルを更新することができました!それでも、なぜ私がテーブルの制約を変更してON UPDATE CASCADE制約を追加できないのかわからない...? –

+1

編集中に別のセッションからの無効な挿入を防ぐには、前にテーブルをロックしてからロックを解除する必要があります。 –

0

あなたは一時ソリューションを探しているなら、あなたはまた、CASCADEON UPDATEアクションを変更し、あなたはそれがエラーを生成し実行している更新クエリでどのようなあなたのID

関連する問題