0

次のような自己参照テーブルがあります。

「ClassGroup」のテーブル スキーマは次のとおりです。ID 文字
列、主キーの
名前文字列、
ParentClassGroup 文字列、外部キー (このテーブル自体の「id」を参照)

次のトランザクションは期待どおりに成功します。

オートコミットを設定=0;
トランザクションを開始します。
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id1","cg1", null);
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id2","cg2", "id1");
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id3","cg3", null);
専念;

ただし、次のトランザクションは失敗します。

オートコミットを設定=0;
トランザクションを開始します。
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id2","cg2", "id1");
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id1","cg1", null);
INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id) values("id3","cg3", null);
専念;

エラーログ:

0 08:14:29 INSERT INTO CLASSGROUP(x_id, x_name, x_parentclassgroup_x_id,x_talend_timestamp) values("id2","cg2", "id1", 123) エラー コード: 1452。子行を追加または更新できません: 外部キー制約が失敗する (hier_master.classgroup、CONSTRAINT FKC0C64078BC2ACBF FOREIGN KEY (x_parentclassgroup_x_id) REFERENCES クラスグループ (x_id))

私の質問は次のとおりです。「id2」のレコードは「id1」のレコードを参照しているため、最初の挿入の前に2番目の挿入を行う必要があることをMySQLサーバーは十分に認識できませんか? 間違った挿入順序が原因で失敗が予想されますか? Oracle のような他のデータベースでのトランザクションはどうですか?
あなたの洞察と助けに感謝します!

4

2 に答える 2

0

MySQL には、遅延制約チェックと呼ばれるこのための規定があります。

それが行うことは、各挿入ステートメントの後に制約違反をチェックする通常の方法とは対照的に、ユーザーが実行するテーブルに対するすべての操作を実行し、次に制約違反をチェックすることです。

遅延制約チェックの正確な構文はわかりませんが、インターネットで簡単に見つけることができると確信しています。これが役立つことを願っています!:)

于 2015-02-15T17:55:54.150 に答える