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

아래와 같이 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)).

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



답변

에서 촬영 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테이블에 행을 삽입해야 합니다.


답변

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

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

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


답변

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


답변

문제는 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;


답변

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

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

이제 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구문을 사용하여 외래 키 제약 조건을 적용 할 수 있습니다 .


답변

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


답변

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

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