오류 1452 : 하위 행을 추가하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패합니다.


132

아래와 같이 MySQL Workbench에서 테이블을 만들었습니다.

ORDRE 테이블 :

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

PRODUKT 테이블 :

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

ORDRELINJE 테이블 :

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

그래서 ORDRELINJE테이블에 값을 삽입하려고 하면 다음과 같은 결과가 나타납니다.

오류 코드 : 1452. 하위 행을 추가하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패했습니다 ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID)).

이 주제에 대한 다른 게시물을 보았지만 운이 없습니다. 내가 무엇을 감독하고 있거나 무엇을해야할지 생각하고 있습니까?


답변:


172

에서 촬영 FOREIGN KEY 제약 조건을 사용하여

외래 키 관계에는 중앙 데이터 값을 보유하는 상위 테이블과 상위를 다시 가리키는 동일한 값이있는 하위 테이블이 포함됩니다. FOREIGN KEY 절은 하위 테이블에 지정됩니다.

상위 테이블에 일치하는 후보 키 값이없는 경우 하위 테이블에 외래 키 값을 생성하려는 모든 INSERT 또는 UPDATE 작업이 거부됩니다.

따라서 오류는 Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails본질적으로 Ordrelinje테이블에 일치하는 행 (OrderID)이없는 테이블에 행을 추가하려고한다는 것을 의미 Ordre합니다.

먼저 Ordre테이블에 행을 삽입해야 합니다.


또는 외래 키를 삭제 한 다음 데이터 삽입 후 외래 키를 추가 할 수 있습니까?
Vamsi Pavan Mahesh 2015

@VamsiPavanMahesh, 아니요, 그렇게해도 원인이됩니다. 키 데이터가 일치하지 않기 때문에 동일한 종류의 오류와 함께 외부 키 생성이 실패합니다.
Rahul

4
간단히 말해서 자식에 부모 ID가 정의되어 있으면 이러한 부모가 존재해야합니다. 제 문법이 틀렸다고 생각했는데 ... 많은 도움이되었습니다. 감사!
wst apr

2
선택적 관계는 어떻습니까?
하메드 Hamedi

40

Ordre테이블 OrdreID에 삽입 명령에 제공된 참조가 없기 때문에이 제약 조건 검사 를 받게됩니다.

의 값을 삽입하려면 Ordrelinje, 먼저에 값을 입력해야 Ordre테이블과 같은 사용 OrdreIDOrderlinje테이블.

또는 not null 제약 조건을 제거하고 NULL 값을 삽입 할 수 있습니다.


29

상위 테이블 기본 키에 해당하는 외래 키 값이없는 하위 테이블의 데이터를 삭제하거나 하위 테이블에서 모든 데이터를 삭제 한 다음 상위 테이블에 기본 키와 동일한 외래 키 값을 갖는 새 데이터를 삽입해야합니다. . 작동합니다. 여기도 유튜브 비디오


1
이것은 정확합니다. 데이터를 피벗 테이블 (CASCADE 제약 조건이있는)에 삽입하기 전에 부모 테이블에 데이터를 삽입해야합니다. 예 : 첫 번째 테이블-권한; 두 번째 테이블-역할; 세 번째 테이블-permission_role; 따라서 첫 번째는 권한 테이블에 삽입하고 두 번째는 역할 테이블에 삽입하고 마지막으로 permission_role 테이블에 삽입합니다.
Deepak Panwar

24

문제는 FOREIGN KEY 제약 조건입니다. 기본적으로 (SET FOREIGN_KEY_CHECKS = 1). FOREIGN_KEY_CHECKS 옵션은 InnoDB 테이블에 대한 외래 키 제약 조건을 확인할지 여부를 지정합니다. MySQL-FOREIGN_KEY_CHECKS 설정

쿼리를 실행하기 전에 외래 키 검사를 비활성화로 설정할 수 있습니다. 외래 키를 비활성화합니다 .

쿼리를 실행하기 전에 이러한 줄 중 하나를 실행하면 쿼리를 성공적으로 실행할 수 있습니다. :)

1) 세션 용 (권장)

SET FOREIGN_KEY_CHECKS=0;

2) 전 세계적으로

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

이 오류는 일반적으로 상위 테이블 의 참조 / 후보 필드에 존재하지 않는 하위 테이블 의 참조 필드에 일부 값이 있기 때문에 발생 합니다.

때로는 데이터가 이미있는 기존 테이블에 외래 키 제약 조건을 적용 할 때이 오류가 발생할 수 있습니다 . 다른 답변 중 일부는 자식 테이블에서 데이터를 완전히 삭제 한 다음 제약 조건을 적용 할 것을 제안합니다. 그러나 하위 테이블에 작업 / 생산 데이터가 이미있는 경우에는 이는 옵션이 아닙니다. 대부분의 시나리오에서 자식 테이블의 데이터 를 삭제하는 대신 업데이트해야합니다 .

이제 Left Join부모 테이블에 일치하는 값이없는 자식 테이블의 모든 행을 찾는 데 활용할 수 있습니다 . 다음 쿼리는 일치하지 않는 행을 가져 오는 데 유용합니다.

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

이제 일반적으로 다음 단계 중 하나 이상을 수행하여 데이터를 수정할 수 있습니다.

  1. "비즈니스 논리"에 따라 이러한 일치하지 않는 값을 상위 테이블의 기존 값으로 업데이트 / 일치해야합니다. 때때로 설정해야 할 수도 null있습니다.
  2. 일치하지 않는 값이있는 행을 삭제하십시오.
  3. 하위 테이블의 일치하지 않는 값에 해당하는 새 행을 상위 테이블에 추가하십시오.

데이터가 수정되면 ALTER TABLE구문을 사용하여 외래 키 제약 조건을 적용 할 수 있습니다 .


나는 테이블의 모든 데이터를 삭제하고 다음을가 추가 된 외래 키를 추가 감사
수밋 쿠마르 굽타을

4

외래 키 테이블에는 관련 될 기본 키 테이블에서 소유하지 않은 값이 있으므로 먼저 모든 데이터를 삭제하고 기본 키에있는 값에 따라 외래 키 테이블의 값을 조정해야합니다.


3

부모 테이블에 자식 테이블에서 참조하는 모든 값이 있지만이 문제가 발생했습니다. 문제는 단일 외래 키에 여러 하위 참조를 추가 할 수 없다는 것입니다. 즉, 동일한 외래 키를 참조하는 5 행의 데이터가있는 경우 MySQL은 첫 번째 행만 업로드하도록 허용하고 오류 1452를 표시했습니다.

나를 위해 일한 것은 "SET GLOBAL FOREIGN_KEY_CHECKS = 0"코드를 입력하는 것입니다. 그 후 MySQL을 닫고 다시 시작했고 오류없이 모든 데이터를 업로드 할 수있었습니다. 그런 다음 "SET GLOBAL FOREIGN_KEY_CHECKS = 1"을 입력하여 FOREIGN_KEY_CHECKS가 무엇을하는지 완전히 확실하지 않지만 시스템을 정상으로 되돌 렸습니다. 도움이 되었기를 바랍니다!


이것은 @ Mr-Faizan이 게시 한 답변에서 이미 제안 된 것이 아닙니까? 그렇지 않다면 귀하의 답변에 추가되는 내용을 설명하십시오.
Adrian Mole

2

먼저 부모 테이블에 각 레코드를 삽입하여이 문제를 해결할 수 있으며 그런 다음 자식 테이블의 각 열에 레코드를 삽입 할 수 있습니다. 또한 열의 데이터 유형과 크기를 확인하십시오. 상위 테이블 열과 동일해야하며 엔진과 데이터 정렬도 동일해야합니다. 이 시도! 이것이 내가 내 문제를 해결 한 방법입니다. 틀렸다면 정정하십시오.


1

귀하의 ORDRELINJE테이블에 연결된 ORDER테이블이 외래 키 제약 조건을 사용 constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)하는에 따라 Ordre int NOT NULL,테이블의 컬럼 ORDRELINJE어떤 일치해야합니다 Ordre int NOT NULL,의 열 ORDER테이블을.

이제 여기서 일어나는 일은 ORDRELINJE테이블에 새 행을 삽입 할 때 fk 제약 조건에 따라 테이블 Ordrelinje_fk이 있는지 ORDER여부를 확인 OrdreID하고 OrderId와 일치하지 않으므로 컴파일러가 외래 키 위반에 대해 불평하는 것입니다. 이것이이 오류가 발생하는 이유입니다.

외래 키는 두 테이블을 연결하기 위해 모든 테이블에서 사용하는 다른 테이블의 기본 키입니다. 이 키는 테이블을 생성하는 동안 지정한 외래 키 제약 조건에 의해 바인딩됩니다. 데이터에 대한 모든 작업은이 제약을 위반하지 않아야합니다. 이 제약 조건을 위반하면 이와 같은 오류가 발생할 수 있습니다.

내가 분명히했으면 좋겠어.


1

외래 키 속성 값을 삽입하는 동안 먼저 상위 관계의 기본 키 속성 값뿐만 아니라 속성 유형을 확인합니다. 상위 관계의 값이 일치하면 하위 속성 값을 쉽게 삽입 / 업데이트 할 수 있습니다.


1

PRIMARY TABLE의 REFERENCES KEY에서 CHILD TABLE의 FOREIGN KEY로
데이터를 추가해야합니다. 이는 외래 키에 임의의 데이터를 추가하지 않고 액세스 가능한 기본 키의 데이터 만 사용함을 의미합니다.

외래 키의 데이터 설명


1

이것은 @ Mr-Faizan의 및 기타 답변을 읽은 후 나를 도왔습니다.

'외래 키 검사 사용'을 선택 해제하십시오.

phpMyAdmin에서 쿼리를 누르십시오. WorkBench에 대해 잘 모르지만 다른 답변이 도움이 될 수 있습니다.


0

각 테이블 (외래 키가 가리키는 테이블)에 최소한 하나의 원시를 삽입해야하며 외래 키의 값을 삽입하거나 업데이트 할 수 있습니다.


0

여기에서 이것을 짜내십시오. 제 경우는 dint가 존재하는 게시물에 대해 좋아요를 만들려고했습니다. 데이터베이스에 커밋하는 동안 오류가 발생했습니다. 해결책은 먼저 게시물을 만든 다음 좋아하는 것입니다. 내 이해에서 post_id가 likes 테이블에 저장되는 경우 먼저 posts 테이블을 확인하여 존재를 확인해야했습니다. 나에게 더 논리적이기 때문에 이런 식으로하는 것이 더 낫다는 것을 알았습니다 ..


0

사용중인 경우 외래 키를 , 당신의 열 순서가 동일해야합니다삽입 .

예를 들어, 추가하는 경우 (userid, password)표 1 에서 표 2 에서 다음 표 2의 순서로하는 것은 동일해야 (userid, password)하고 하지 같은 (password,userid)userid입니다 외래 키표 2표가 .


0

자식 테이블에 일부 데이터를 삽입 한 후 자식 테이블에 외래 키를 설정하기 때문에 문제가 발생합니다.

자식 테이블에서 모든 데이터를 제거한 다음 외래 키를 설정하고 나중에 테이블에 데이터를 추가 / 삽입하면 작동합니다.


0

아니오를 확인하십시오. 하위 테이블 및 기본 키와 일치하는 상위 테이블의 레코드 수가 외래 키 참조와 일치해야합니다. 이것은 나를 위해 작동합니다.


-4

100 % 작동 ...

오류 1452 : 하위 행을 추가하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패합니다 .... 이러한 유형의 오류가 발생하면 먼저이 테이블로 이동하여 설정을 확인합니다.> 엔진이 InnoDB인지 확인한 다음 MyISAM으로 변경합니다.

(참조 외부 제약 조건 삭제)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.