2009-05-30 7 views
0

私は2つのエントリを含むテーブルを持っています。mysqlの外部キー制約付きの挿入に関する提案

CREATE TABLE `db`.`main` (
    `id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
); 
ような何か

これらの2つのエントリのIDが自動的にプライマリキーが生成されます。

私は

CREATE TABLE `db`.`day` (
    `main_id` int(10) unsigned NOT NULL, 
    `day` tinyint(4) NOT NULL, 
    CONSTRAINT `fk_db_main` FOREIGN KEY (`main_id`) REFERENCES `main` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
); 

を結ぶルールに別のテーブルを持っている今、私は正常に

SELECT * FROM main where id='9'; 

を使用して結果を得ることができますが、私は

INSERT INTO day (main_id, day) VALUES (9, 0); 

を実行しようとすると、私は

を取得します

"子行を追加または更新できません:外部キー制約は失敗します(dbday、CONSTRAINT fk_db_main FOREIGN KEY(main_idは)mainid)ON UPDATE ON NO ACTIONのNO ACTIONを削除しない)私は、インサートで行方不明です何で(1452年)、」

任意の提案ですか?

** I HADNを参照します実際の原因は、主なdbテーブルがMyISAMにあり、InnoDBテーブルがそれに接続する外部キーを作成できないということでした。つまり、MyISAMはサポートしていません

+0

insertステートメントが正常に表示されます。 –

+0

私はあなたが「メイン」テーブルに2つの「エントリー」があると思うことに困惑しています。私の考え方には、IDという1つの列があり、それも表の主キーです。 –

+1

また、なぜあなたはSELECTで '9'を引用していますか? SELECTを実行すると、どのような結果が得られますか? –

答えて

0

質問中に実際に問題の原因が記載されていませんでした。実際の原因は、メインdbテーブルがMyISAMにあり、InnoDBテーブルがそれに接続する外部キーを作成できなかったことです。簡単に言えば、MyISAMは他のテーブルから来ているときでも、外部キーをサポートしていません。

1

FOREIGN KEY制約には、「外部キーが存在しなければなりません。 'day'テーブルに新しく挿入された 'main_id'の値と一致するID値を持つ 'main`テーブルのエントリ。

'day'に値9を挿入すると、ID = 9の 'main'にすでに行がありますか?

DBMSはそうは考えていません - その理由は不平です。

+0

はい、idが9のmainから値9のidを選択すると、9が返されます。 – lief79

+0

OK - Alex Martelliは正しい道にあると思います。 'main'という名前のテーブルが' db'''main'という名前だけあり、あなたの外部キーがあなたが思うテーブルを参照していません。 –

2

CREATE TABLEステートメントのdb.部分を削除して(mainidの9の行を挿入すると)インサートが動作します。問題は、という接頭辞を一貫して使用していない、つまりTABLEの後に、しかしCONSTRAINTの句には... ...という矛盾があります。

+0

+1あなたが照会しているデータベースを二重チェックすることを提案しようとしていました。 –

+0

トリガーを作成しても、それが依存するデータが存在しないと問題が発生しないと言っていますか?私はそれを調べなければならないでしょう。 – lief79

関連する問題