web-dev-qa-db-ja.com

MySQLデータベースの外部キー値を更新する方法

3つのテーブルがあります。カテゴリー、言語、categorys_languagesです。 Categories_languagesは、カテゴリと言語をリンクする多対多のテーブルです。テーブル言語で外部キー値を更新したいのですが、エラー#1451-親行を削除または更新できません:外部キー制約が失敗します!

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'を作成できません(errno:121)

12
Primoz Rome

外部キーのチェックを一時的に停止できます。

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エラー)です。ターゲットファイルシステムに権限の問題があるか、ファイル名の#文字をサポートしていない可能性がありますか?

45
RavuAlHemio

一時的な解決策を探している場合は、ON UPDATEアクションをCASCADEに追加し、IDを変更します

2
hshahdoost