>  기사  >  데이터 베이스  >  외래 키 DDL은 Oracle에서 정상적으로 실행되지만 예외 및 해결 방법은 mysql에 보고됩니다.

외래 키 DDL은 Oracle에서 정상적으로 실행되지만 예외 및 해결 방법은 mysql에 보고됩니다.

php是最好的语言
php是最好的语言원래의
2018-08-01 14:56:311717검색

Mysql 외래 키 제약 조건 설계 결함을 기억하세요

배경 정보

최근 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)

Oracle의 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

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

실행할 때 마지막 문장에서 예외가 보고되었습니다

[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은 다양한 유형의 호환성을 결정할 수 있습니다.

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

Summary

  1. Mysql의 외래 키 제약 조건 설계에 결함이 있어 단위가 다른 필드가 달라야 한다면 FOREIGN KEY 추가 시 유형이 다르다고 해서 모호해지는 대신 예외를 보고해야 합니다. 실제 값은 동일하지 않은 것으로 판단됩니다.

  2. 데이터베이스 테이블을 관리할 때 서로 다른 테이블에서 동일한 의미를 갖는 열 유형이 일관되어야 합니다.

관련 기사:

MySQL 외래 키 제약 조건 방법_MySQL

MySQL 외래 키 제약 조건 계단식 삭제

관련 동영상:

Cheetah.com MySQL 비디오 튜토리얼

위 내용은 외래 키 DDL은 Oracle에서 정상적으로 실행되지만 예외 및 해결 방법은 mysql에 보고됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.