Maison  >  Article  >  base de données  >  Le DDL de clé étrangère s'exécute normalement dans Oracle, mais les exceptions et les solutions sont signalées dans MySQL

Le DDL de clé étrangère s'exécute normalement dans Oracle, mais les exceptions et les solutions sont signalées dans MySQL

php是最好的语言
php是最好的语言original
2018-08-01 14:56:311717parcourir

Souvenez-vous d'un défaut de conception de contrainte de clé étrangère Mysql

Informations générales

Je réalise actuellement un projet de migration de base de données d'Oracle vers Mysql. Une contrainte de clé étrangère s'exécute normalement dans Oracle et génère des rapports dans MySQL. . anormal. (Comme je n'ai pris la relève que depuis quelques jours, je ne connais pas le métier et le framework, j'ai donc passé beaucoup de temps à régler le problème.)

[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)

DDL d'Oracle

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');

signale une exception lors de l'exécution de la dernière phrase

[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)

Raison : ModelID des modèles est décimal (6,0), tandis que ModelID of Orders est décimal (8, 0), les deux sont connectés via des clés étrangères. Étant donné que les types sont incohérents, MySQL ne pensera pas qu'ils sont nécessairement inégaux et Oracle peut déterminer la compatibilité des différents types.

Solution
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

Résumé

  1. La conception des contraintes de clé étrangère de MySQL est défectueuse Si les champs des différentes unités doivent être différents, Une exception doit être signalée lorsque FOREIGN KEY est ajoutée, au lieu d'être ambiguë car les types sont différents, mais les valeurs réelles sont égales, elle est jugée comme non égale.

  2. Lors de la maintenance des tables de base de données, les types de colonnes ayant la même signification dans différentes tables doivent être cohérents.

Articles connexes :

Méthode de contrainte de clé étrangère MySQL_MySQL

Cascade de contraintes de clé étrangère MySQL Supprimer

Vidéos associées :

Tutoriel vidéo Cheetah MySQL

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn