[エラー] Invalid row key specified: ~ , referred to in ~
- 2011 11/13
Symfony1.4にて、フィクスチャーファイルからデータベースにデータを入れようとしたらエラー。
# php symfony doctrine:data-load |
■ エラー内容
Invalid row key specified: (user) , referred to in (rental) Rental_4 |
MySQLの外部キー制約のため、関連付けのある部分に値がを入れておらず、エラーになっていました。
mysql> show create table rental; +--------+--| Table | Create Table ---------------------------------------+ | rental | CREATE TABLE `rental` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT NULL, `rented_at` datetime DEFAULT NULL, `returned_at` datetime DEFAULT NULL, `delete_flag` tinyint(1) NOT NULL DEFAULT '0', `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `slug` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `rental_sluggable_idx` (`slug`), KEY `user_id_idx` (`user_id`), CONSTRAINT `rental_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | +--------+----------------------------+ |
ここの設定のせいで、外部キーがあるカラムをNULLにできませんでした。
CONSTRAINT `rental_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE |
■ 解決方法
MySQLにログインして、下記のコマンドで外部キーを削除します。
・参考:MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 9.4.4 FOREIGN KEY 制約
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol; |
あと、関連付けのあるカラムのfixtureファイルの書き方なんですが、以下のように書いてはいけません。
Rental: Rental_1: User: [User_1] rented_at: '2011-01-01' returned_at: delete_flag: 0 Rental_2: User: rented_at: returned_at: delete_flag: 0 |
Rental_2 の User: のように書くと、Userに対応するオブジェクトを探しに行って、なくてエラーになるそうです。
代わりに、User: の部分を user_id: と書けばOKです。もしくは、値を入れないので user_id: そのものを書かないという選択肢もあります。
以上です。