外部キー DDL は Oracle で正常に実行されますが、例外と解決策は mysql で報告されます

php是最好的语言
リリース: 2018-08-01 14:56:31
オリジナル
1768 人が閲覧しました

Mysql の外部キー制約の設計上の欠陥を思い出してください

背景情報

最近、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)
ログイン後にコピー

OracleのDDL

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
ログイン後にコピー
ログイン後にコピー

MysqlのDDL

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
ログイン後にコピー
ログイン後にコピー

概要

  1. Mysqlの外部キー制約の設計には欠陥があり、異なるユニットのフィールドが異なる必要がある場合、型が異なるため曖昧になるのではなく、FOREIGN KEYを追加するときに例外が報告される必要があります。実際の値は等しい、等しくないと判断されます。

  2. データベーステーブルを保守するときは、異なるテーブル内で同じ意味を持つ列の型が一貫している必要があります。

関連記事:

MySQL 外部キー制約の方法_MySQL

MySQL 外部キー制約のカスケード削除

関連動画:

Cheetah.com MySQL ビデオ チュートリアル

以上が外部キー DDL は Oracle で正常に実行されますが、例外と解決策は mysql で報告されますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート