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)
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');
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.
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
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.
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 :
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!