Ich führe derzeit ein Datenbankmigrationsprojekt von Oracle nach MySQL durch. Eine Fremdschlüsseleinschränkung läuft normal in Oracle und meldet in MySQL . abnormal. (Da ich die Leitung erst seit ein paar Tagen übernommen habe, bin ich mit dem Geschäft und den Rahmenbedingungen nicht vertraut und habe daher viel Zeit damit verbracht, mich mit dem Problem zu befassen.)
[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');
Bei der Ausführung des letzten Satzes trat eine Ausnahme auf
[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)
Ursache: Die ModelID von Modellen ist dezimal(6,0) und die ModelID von Aufträgen ist dezimal(8,0 ), und die beiden sind durch Fremdschlüssel verbunden. Da die Typen inkonsistent sind, geht MySQL nicht davon aus, dass sie unbedingt ungleich sind, und Oracle kann die Kompatibilität verschiedener Typen bestimmen.
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
Das Fremdschlüsseleinschränkungsdesign von MySQL ist fehlerhaft. Wenn die Felder in verschiedenen Einheiten unterschiedlich sein müssen, sollte FOREIGN KEY hinzugefügt werden Es wird eine Ausnahme gemeldet. Sie ist nicht mehrdeutig, da die Typen unterschiedlich sind, die tatsächlichen Werte jedoch gleich sind, sondern wird als ungleich beurteilt.
Bei der Pflege von Datenbanktabellen müssen die Spaltentypen mit derselben Bedeutung in verschiedenen Tabellen konsistent sein.
Verwandte Artikel:
MySQL-Fremdschlüsseleinschränkungsmethode_MySQL
MySQL-Fremdschlüsseleinschränkungskaskade Löschen
Ähnliche Videos:
Das obige ist der detaillierte Inhalt vonFremdschlüssel-DDL läuft normal in Oracle, Ausnahmen und Lösungen werden jedoch in MySQL gemeldet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!