최근 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)
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');
실행할 때 마지막 문장에서 예외가 보고되었습니다
[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)이며, 둘은 외래 키를 통해 연결됩니다. 유형이 일관되지 않기 때문에 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
Mysql의 외래 키 제약 조건 설계에 결함이 있어 단위가 다른 필드가 달라야 한다면 FOREIGN KEY 추가 시 유형이 다르다고 해서 모호해지는 대신 예외를 보고해야 합니다. 실제 값은 동일하지 않은 것으로 판단됩니다.
데이터베이스 테이블을 관리할 때 서로 다른 테이블에서 동일한 의미를 갖는 열 유형이 일관되어야 합니다.
관련 기사:
관련 동영상:
위 내용은 외래 키 DDL은 Oracle에서 정상적으로 실행되지만 예외 및 해결 방법은 mysql에 보고됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!