Heim  >  Artikel  >  Datenbank  >  Fremdschlüssel-DDL läuft normal in Oracle, Ausnahmen und Lösungen werden jedoch in MySQL gemeldet

Fremdschlüssel-DDL läuft normal in Oracle, Ausnahmen und Lösungen werden jedoch in MySQL gemeldet

php是最好的语言
php是最好的语言Original
2018-08-01 14:56:311715Durchsuche

Erinnern Sie sich an einen Designfehler bei MySQL-Fremdschlüsseleinschränkungen

Hintergrundinformationen

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)

Oracles 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

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

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.

Lösung
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

Zusammenfassung

  1. 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.

  2. 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:

Cheetah MySQL Video-Tutorial

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn