아래와 같이 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
, CONSTRAINTOrdrelinje_fk
FOREIGN KEY (Ordre
) REFERENCESOrdre
(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
테이블과 같은 사용 OrdreID
의 Orderlinje
테이블.
또는 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
이제 일반적으로 다음 단계 중 하나 이상을 수행하여 데이터를 수정할 수 있습니다.
- “비즈니스 논리”에 따라 이러한 일치하지 않는 값을 상위 테이블의 기존 값으로 업데이트 / 일치해야합니다. 때때로 설정해야 할 수도
null
있습니다. - 일치하지 않는 값이있는 행을 삭제하십시오.
- 하위 테이블의 일치하지 않는 값에 해당하는 새 행을 상위 테이블에 추가하십시오.
데이터가 수정되면 ALTER TABLE
구문을 사용하여 외래 키 제약 조건을 적용 할 수 있습니다 .
답변
외래 키 테이블에는 관련 될 기본 키 테이블에서 소유하지 않은 값이 있으므로 먼저 모든 데이터를 삭제하고 기본 키에있는 값에 따라 외래 키 테이블의 값을 조정해야합니다.
답변
부모 테이블에 자식 테이블에서 참조하는 모든 값이 있지만이 문제가 발생했습니다. 문제는 단일 외래 키에 여러 하위 참조를 추가 할 수 없다는 것입니다. 즉, 동일한 외래 키를 참조하는 5 행의 데이터가있는 경우 MySQL은 첫 번째 행만 업로드하도록 허용하고 오류 1452를 표시했습니다.
나를 위해 일한 것은 “SET GLOBAL FOREIGN_KEY_CHECKS = 0″코드를 입력하는 것입니다. 그 후 MySQL을 닫고 다시 시작했고 오류없이 모든 데이터를 업로드 할 수있었습니다. 그런 다음 “SET GLOBAL FOREIGN_KEY_CHECKS = 1″을 입력하여 FOREIGN_KEY_CHECKS가 무엇을하는지 완전히 확실하지 않지만 시스템을 정상으로 되돌 렸습니다. 도움이 되었기를 바랍니다!