하위 행을 추가하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패합니다.
표 1:
들판 | 유형 | 특수한 순서 | 열쇠 | 체납 | 추가의 |
---|---|---|---|---|---|
사용자 ID | int(11) | 아니요. | PRI | 특수한 순서 | auto_module(자동) |
패스워드 | varchar(20) | 아니요. | |||
사용자 이름 | varchar(25) | 아니요. | |||
이메일 | varchar(60) | 아니요. |
표 2:
들판 | 유형 | 특수한 순서 | 열쇠 | 체납 | 추가의 |
---|---|---|---|---|---|
사용자 ID | int(11) | 아니요. | 멀티 | ||
포스트 아이디 | int(11) | 아니요. | PRI | 특수한 순서 | auto_module(자동) |
제목 | varchar(50) | 아니요. | |||
요약 | varchar(500) | 아니요. |
오류:
com.mysql.jdbc.exceptions.com.://com.mysql.jdbc.exceptions.com.jdbc MySQLIntegrityConstraintViolationMySQLIntegrityConstraintViolation(SQLIntegrityConstraintViolation)추가 을 할 수 없음: 키 이 실패합니다 「」 「」 「」 「」: 「」 「」 「」).
myapp/table2
, 제 , , , ,table2_ibfk_1
키Foreign Key)UserID
table1
)UserID
제가 무엇을 잘못했지요?http://www.w3schools.com/Sql/sql_foreignkey.asp을 읽었는데 뭐가 문제인지 모르겠어요.
는 이 에러를 행의 추가/있기 때문입니다.table2
.UserID
되어 있는 table1
코드를 좀 더 올려주시면 구체적인 원인 진단을 도와드리겠습니다.
을 table2
a UserID
값table1
.
간단한 해킹은 테이블에서 작업을 수행하기 전에 외부 키 검사를 비활성화하는 것입니다.단순 쿼리
SET FOREIGN_KEY_CHECKS=0
그러면 다른 테이블과의 외부 키 조회가 비활성화됩니다.테이블 작업이 완료되면 다시 활성화하십시오.
SET FOREIGN_KEY_CHECKS=1
이것은 나에게 여러 번 효과가 있다.
이 작업을 수행할 때는 DANGER ZONE을 입력해야 합니다.유효한 사용 사례가 있는 것은 확실하지만, 그 의미를 이해하고 있다고 확신하는 경우에만 이 작업을 수행해야 합니다.
또 다른 이상한 사례를 발견했어요InnoDB 테이블에서 MyISAM 테이블로 실수로 외부 키를 생성하면 데이터가 유효하더라도 MySQL은 삽입 시 이 오류를 발생시킵니다.
http://nick.zoic.org/art/mysql-foreign-key-error/ 를 참조해 주세요.
int에 값이 때문에 합니다.table2.UserID
존재하지 않는 것table1.UserID
것 .table2.UserID
value manualy)를 지정합니다.
이 장면의 한 가지 예는 다음과 같습니다.table1.UserID
1, 2, 3 및 "1, 2, 3"table2.UserID
값을 4( 매뉴얼에 의해 추가).값 4를 가져옵니다(수동으로 추가).그래서 외국 키를 만들 때, 래 국 를 들 , 을 key so when없찾수 make때,다 a you can' foreign만t키그외 they find은그들서 key so whenUserID = 4
부에서table1
오류가 발생할 것입니다.그러면 오류가 발생합니다.
To fix this error, just remove 이 오류를 수정하려면UserID = 4
부에서table2
는는둘둘둘다다다다다다외외외외외 여여여여여
행운을 빕니다.
이걸 알아내는 데 시간이 좀 걸렸어요간단히 말해, 다른 테이블을 참조하는 테이블에는 이미 데이터가 포함되어 있으며 상위 테이블에 하나 이상의 값이 존재하지 않습니다.
예: 표 2에는 다음과 같은 데이터가 있습니다.
UserID PostID Title Summary
5 1 Lorem Ipsum dolor sit
표 1.
UserID Password Username Email
9 ******** JohnDoe john@example.com
table2를 ALTER하고 외부 키를 추가하려고 하면 쿼리는 실패합니다.왜냐하면 사용자가표 1에 ID=5가 없습니다.
표 2에 외부 키를 작성하기 전에 표 1에 행을 삽입한 경우 자동 증분 값이 표 1에 2, 표 2에 1이 되므로 외부 키 제약 오류가 발생합니다.이 문제를 해결하려면 표 1을 잘라내고 자동 증분 값을 1로 다시 설정해야 합니다.그런 다음 표 2를 추가할 수 있습니다.
MyISAM에서는 외부 키와 트랜잭션이 지원되지 않으므로 데이터베이스 엔진을 InnoDB로 설정했는지 확인하십시오.
약간의 수정 사항: 표 1의 JoinColumn 'signable = true' 및 표 2의 'UserID' 필드 'insertable=false' 및 'signable=true'로 설정합니다.
표 1 엔티티:
@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;
표 2 엔티티:
@Column(insertable = false, nullable = true)
private int UserID;
나도 같은 문제가 있었어 해결이 쉬웠지
부모 테이블에 존재하지 않는 아이디를 자녀 테이블에 추가하려고 합니다.
시킬 수 를 들어 InnoDB는 auto_increment 컬럼을 증가시킬 수 있습니다.예를 들어 다음과 같습니다.INSERT ... ON DUPLICATE KEY
저도 비슷한 문제가 있었어요.내용이 있는 테이블에 외부 키를 적용하려고 하는데 열이 null이 아닙니다.두 가지 옵션이 있습니다.
- 외부 키 제약 조건을 적용할 열을 null로 만듭니다.이렇게 하면 일부 필드가 null이 될 수 있으므로 외부 키가 적용됩니다.(이것이 내가 한 일이다.)
- 외부 키 제약 조건을 적용할 열을 만들고 쿼리를 작성하여 외부 키를 열에 삽입한 다음 외부 키 제약 조건을 적용하십시오. (이 작업은 시도하지 않았지만 작동해야 합니다.)
외부 키에 삽입하는 값이 부모 테이블에 있는지 확인하십시오.그게 도움이 됐어요.를 들어, " " 를 하면,user_id = 2
table.2
table.1
있지 않다user_id = 2
이 경우 제약조건은 오류를 발생시킵니다.1452년이것이 같은 문제를 가지고 있는 다른 사람에게도 도움이 되기를 바랍니다!
저도 같은 문제가 있었는데, 그 이유는 외국 키를 추가하기 전에 첫 번째 테이블에 줄이 있었기 때문입니다.
table2의 UserID 필드의 인덱스를 삭제합니다.나한테는 잘 어울린다
저도 같은 문제에 직면했는데, 문제는 부모 테이블 엔트리의 값이 외부 키 테이블 값과 일치하지 않는다는 것입니다.따라서 모든 행을 클리어한 후 다시 시도하십시오.
다른 사람이 제공한 솔루션이 작동하지 않았을 경우.그런 다음 부모 테이블과 자녀 테이블의 데이터베이스 엔진을 확인해 보십시오.저 같은 경우에는 부모 테이블의 엔진을 MyISAM으로 설정하고 InnoDB로 수정했습니다.
이것이 나처럼 곤경에 처한 다른 사람들에게 도움이 되기를 바란다.
데이터베이스의 캐스케이드에 ondelete 필드를 배치하지 마십시오.
따라서 onDelete 필드를 RESTRICT로 설정합니다.
행운을 빌어요♥
또 다른 이상한 사건이 있어서 이 오류가 발생했어요.외부 키를 ID primary 키로 잘못 참조했습니다.이는 잘못된 alter table 명령어로 인해 발생합니다.INFORMATION_SCHEMA 테이블을 조회하여 이를 확인하였습니다(이 stackoverflow 답변 참조).
테이블이 너무 혼란스러워서 ALTER TABLE 명령으로 수정할 수 없었습니다.나는 마침내 그 탁자를 떨어뜨리고 재건했다.이로써 integrityError가 삭제되었습니다.
당신이 '아예'를 추가했을 때userID
에 대한 이 "" " " " 입니다. " 입니다.0
NOT NULL
또한 "자행 추가 또는 업데이트 불가: 외부 키 제약에 실패했습니다"라는 오류도 표시되었습니다.상위 테이블에 새 행을 추가할 때 오류가 발생했습니다.
문제는 자녀 테이블이 아닌 부모 테이블에 외부 키 제약이 정의되어 있다는 것입니다.
mysql 인덱스 또는 테이블 간의 관계를 사용하는 경우 먼저 컬럼(city_id 등)을 삭제하고 동일한 이름의 새로운 컬럼(city_id 등)을 작성합니다.그럼 다시 해봐...
테이블에 포함된 기존 데이터가 있습니까?이 경우 외부 키를 추가할 테이블 내의 모든 데이터를 지웁니다.그런 다음 코드를 다시 실행합니다(외부 키 추가).
저는 이 문제를 여러 번 겪었습니다.이 테이블 내의 모든 데이터는 기존 테이블에 외부 키를 추가할 때 삭제됩니다.
이것이 효과가 있기를 바랍니다:)
이 오류는 부모 테이블의 프라이머리 키에 존재하지 않는 값을 가진 외부 키를 추가할 때 발생합니다.새 외부 키 사용자가 다음 중 하나인지 확인해야 합니다.table2의 ID는 table1 프라이머리 키에 존재하는 값을 가지며, 디폴트로는 늘 또는0 이 될 수 있습니다.
먼저 table2 내의 외부 키의 모든 필드를 table1의 프라이머리 키에 존재하는 값으로 갱신할 수 있습니다.
update table2 set UserID = 1 where UserID is null
다른 사용자를 추가할 경우각 행을 원하는 값으로 수정해야 하는 ID입니다.
NOT NULL 체크박스가 있는 열을 추가한 경우 모든 행에 해당 열에 대한 값이 = 0인 것을 확인할 수 있습니다. 외부 키를 추가하려고 하면 외부 테이블 2에 값이 0인 행이 없을 수 있습니다. 따라서 mysql 오류 팝업이 표시됩니다.
하위 테이블 외부 키 제약 조건이 실패합니다.
이 문제는 다음과 같은 이유로 발생할 수 있습니다.
Spring mvc에서 실행하는 경우 ID 유형을 명시적으로 기술해야 합니다.이는 mysql이 ID 유형을 인식하지 못할 수 있기 때문입니다.따라서 엔티티 클래스의 두 테이블에서와 같이 명시적으로 설정합니다.@GeneratedValue (strategy = GenerationType.IDENTITY)
언급URL : https://stackoverflow.com/questions/5005388/cannot-add-or-update-a-child-row-a-foreign-key-constraint-fails
'itsource' 카테고리의 다른 글
MySQL FK의 적절한 명명 규칙은 무엇입니까? (0) | 2023.01.19 |
---|---|
mysql 데이터베이스에 슈퍼 권한을 추가하는 방법 (0) | 2023.01.19 |
PDO 준비됨 단일 쿼리에 여러 행을 삽입합니다. (0) | 2023.01.19 |
MySQL이 "데이터 전송 중" 상태이면 어떤 의미입니까? (0) | 2023.01.19 |
열이 다른 열에서 계산되었습니까? (0) | 2023.01.19 |