最近、Oracle から Mysql へのデータベース移行プロジェクトを行っていますが、外部キー制約は Oracle では正常に実行されますが、mysql では例外が報告されます。 (引き継いで数日なので業務やフレームワークに詳しくなく、対応にかなりの時間を費やしました。)
[2018-08-01 13:34:19] [23000][1452] Cannot add or update a child row: a foreign key constraint fails (`bov`.`PRO_SITES_BRANDREQUEST`, CONSTRAINT `AA` FOREIGN KEY (`ID`) REFERENCES `PRO_SITES_SETUPREQUEST` (`ID`) ON DELETE CASCADE)
drop table Models; CREATE TABLE Models ( ModelID number(6) PRIMARY KEY, Name VARCHAR(40) ); drop table Orders; CREATE TABLE Orders ( ModelID number(8) PRIMARY KEY, Description VARCHAR(40), FOREIGN KEY (ModelID) REFERENCES Models (ModelID) ON DELETE cascade ); insert into Models(ModelID, Name) values (1,'model'); insert into Orders(ModelID,Description) values (1,'order');
select * from Models; 1 model select * from Orders; 1 order
drop table Models; CREATE TABLE Models ( ModelID decimal(6,0) PRIMARY KEY, Name VARCHAR(40) ); drop table Orders; CREATE TABLE Orders ( ModelID decimal(8,0) PRIMARY KEY, Description VARCHAR(40), FOREIGN KEY (ModelID) REFERENCES Models (ModelID) ON DELETE cascade ); insert into Models(ModelID, Name) values (1,'model'); insert into Orders(ModelID,Description) values (1,'order');
を実行する際最後の文、例外が報告されました
[2018-08-01 14:06:16] [23000][1452] Cannot add or update a child row: a foreign key constraint fails (`bov`.`Orders`, CONSTRAINT `Orders_ibfk_1` FOREIGN KEY (`ModelID`) REFERENCES `Models` (`ModelID`) ON DELETE CASCADE)
理由: Models の ModelID は 10 進数 (6,0) ですが、Orders の ModelID は 10 進数 (8,0) であり、この 2 つは外部キーを介して接続されています。型が一貫していないため、MySQL は型が必ずしも等しくないとは考えず、Oracle は異なる型の互換性を判断できます。
drop table Orders; CREATE TABLE Orders ( ModelID decimal(6,0) PRIMARY KEY, Description VARCHAR(40), FOREIGN KEY (ModelID) REFERENCES Models (ModelID) ON DELETE cascade ); insert into Orders(ModelID,Description) values (1,'order');
select * from Models; 1 model select * from Orders; 1 order
Mysqlの外部キー制約の設計には欠陥があり、異なるユニットのフィールドが異なる必要がある場合、型が異なるため曖昧になるのではなく、FOREIGN KEYを追加するときに例外が報告される必要があります。実際の値は等しい、等しくないと判断されます。
データベーステーブルを保守するときは、異なるテーブル内で同じ意味を持つ列の型が一貫している必要があります。
関連記事:
関連動画:
以上が外部キー DDL は Oracle で正常に実行されますが、例外と解決策は mysql で報告されますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。