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


174

1 번 테이블

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| UserID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| Password | varchar(20) | NO   |     |         |                |
| Username | varchar(25) | NO   |     |         |                |
| Email    | varchar(60) | NO   |     |         |                |
+----------+-------------+------+-----+---------+----------------+

표 2

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| UserID           | int(11)      | NO   | MUL |         |                |
| PostID           | int(11)      | NO   | PRI | NULL    | auto_increment |
| Title            | varchar(50)  | NO   |     |         |                |
| Summary          | varchar(500) | NO   |     |         |                |
+------------------+--------------+------+-----+---------+----------------+

오류:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: 
Cannot add or update a child row: a foreign key constraint fails 
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`) 
REFERENCES `table1` (`UserID`)) 

내가 뭘 잘못 했니? http://www.w3schools.com/Sql/sql_foreignkey.asp를 읽었으며 무엇이 잘못되었는지 알 수 없습니다.


4
오류를 발생시키는 쿼리를 게시 할 수 있습니까?
Damp

38
간단히 말해서에 table2.UserID존재하지 않는 값을 삽입 / 업데이트하려고합니다 table1.UserID.
Joe Stefanelli

왜 그런지 확실하지 않지만 데이터베이스를 Windows 환경에서 Linux로 옮긴 후에 관계를 삭제하고 다시 만들어야했습니다 (문제가 발생했을 때). 값이 존재했지만 관계를 제거하고 다시 추가하면 값이 수정되었습니다. 분명히 그렇게 조심해야 할 수도 있습니다.
johnsnails

답변:


235

현재에 저장된 값을 기반으로 필드에 table2유효한 값이없는 행을 추가 / 업데이트하려고하기 때문에이 오류가 발생 합니다 . 더 많은 코드를 게시하면 특정 원인을 진단하는 데 도움이 될 수 있습니다.UserIDtable1


PreparedStatement st = connection.prepareStatement ( "table2에 삽입 (UserID, PostID, 제목, 요약)"+ "값 (UserID,?,?,?)");
Tom

15
downvote가 무엇인지 확실하지 않습니다. 내 대답은 완벽하게 유효하고 정확합니다.
Brian Driscoll

흠 ... 준비된 문장에서 명명 된 매개 변수와 명명되지 않은 매개 변수를 혼합하는 것은 좋은 생각이 아닙니다. execute 문에 지정된 UserID에 적절한 값을 가진 "값 (?,?,?,?)"이어야합니다.
브라이언 드리스콜

그래서 table1에서 사용자 ID를 얻으려면 다른 SQL 문을 수행해야합니까?
Tom

5
아마도 0 일 것입니다. 만약 그렇다면 0 Null로 대체하십시오
Jeffrey Nicholson Carré

123

table2없는 UserID값 에 삽입하려고 함을 의미합니다 table1.


104

간단한 해킹은 테이블에서 작업을 수행하기 전에 외래 키 검사를 비활성화하는 것입니다. 간단히 쿼리

SET FOREIGN_KEY_CHECKS=0

이렇게하면 다른 테이블에 대한 외래 키 일치가 비활성화됩니다. 테이블 작업이 끝나면 다시 활성화하십시오.

SET FOREIGN_KEY_CHECKS=1

이것은 많은 시간 동안 나를 위해 작동합니다.


내가 이것을 어떻게 사용 하는가 ??
푸친에서 사친

2
@SachinfromPune은 SET FOREIGN_KEY_CHECKS = 0을 추가합니다. mysql 파일을 시작할 때 SET FOREIGN_KEY_CHECKS = 1; mysql 파일의 끝에서 데이터를 다시
가져 오기

1
문제가되지 않습니까? 당신은 참조 청렴성을 잃습니다.
roadrunner66

올바른 색인 항목이 있으면 참조 무결성이 지원됩니다. 키와 인덱스가 올바르게 설정되어 있으면 대량 입력 중에 키 확인을 비활성화 할 수 있습니다.
버논 키넌

46

다른 이상한 경우를 발견했습니다. 실수로 InnoDB 테이블에서 MyISAM 테이블로 외래 키를 생성하면 데이터가 다른 경우에도 삽입시 MySQL 에서이 오류가 발생합니다.

http://nick.zoic.org/art/mysql-foreign-key-error/를 참조 하십시오


1
예, 같은 문제가 있습니다. 두 개의 테이블이 InnoDB 여야합니다!
emeraldhieu

2
나는 팁에 대해 같은 문제가 있었다. 여기에 이노에의 MyISAM에서 테이블을 변환하는 방법에 대한 MySQL의 문서에 대한 링크의 dev.mysql.com/doc/refman/5.7/en/... TLDR : ALTER table_name 테이블의 ENGINE = InnoDB는;
Guilherme Vaz

실제로, 이것은 내 데이터베이스의 경우입니다. MyISAM 엔진을 InnoDB로 변경하기로 결정했습니다. 마지막으로, 원하는 방식으로 데이터베이스를 사용할 수 있습니다.
Mike

17

table2.UserID존재하지 않는 값 int가 있기 때문에이 오류가 발생 합니다 table1.UserID( table2.UserID이 외래 키를 만들기 전에 값을 수동으로 설정 한 것 같습니다).
이 장면의 예 : table1.UserID값 1,2,3 및 table2.UserID값 4 (수동으로 추가)를 가져옵니다. 당신이 외부 키를 만들 때, 그들은 찾을 수 UserID = 4에서 table1에러가 ocurse됩니다.
이 오류를 해결하려면, 단지 제거 UserID = 4에서 table2또는 당신은 둘 다 비우고 다음 외래 키를 생성 할 수 있습니다.
행운을 빕니다!


11

이것은 알아내는 데 시간이 걸렸습니다. 간단히 말해서, 다른 테이블을 참조하는 테이블에 이미 데이터가 있고 하나 이상의 값이 상위 테이블에 존재하지 않습니다.

예를 들어 Table2에는 다음 데이터가 있습니다.

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

1 번 테이블

UserID    Password    Username    Email
9         ********    JohnDoe     john@example.com

table2를 대체하려고 시도하고 외래 키를 추가하면 UserID = 5가 Table1에 없기 때문에 쿼리가 실패합니다.


10

표 2에서 외래 키를 만들기 전에 테이블 1에 행을 삽입 한 경우 자동 증분 값이 표 1에서 2이고 표 2에서 1이기 때문에 외래 키 제약 조건 오류가 발생합니다. 표 1을 자르고 자동 증분 값을 다시 1로 설정하십시오. 그런 다음 표 2를 추가 할 수 있습니다.


10

MyISAM 외래 키 및 트랜잭션이 지원되지 않으므로 데이터베이스 엔진을 InnoDB로 설정했는지 확인하십시오.


2
ALTER TABLE my_table ENGINE = InnoDB;
Bishwas Mishra

7

조금만 수정하면 : Table1에서 JoinColumn을 'nullable = true'로 만들고 Table2에서 'UserID'필드 'insertable = false'및 'nullable = true'를 만듭니다.

Table1 엔티티에서 :

@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;

Table2 엔티티에서 :

@Column(insertable = false, nullable = true)
private int UserID;

이 답변은 내 문제를 완전히 해결했습니다. 이것을 공유해 주셔서 감사합니다. 나를위한 열쇠는 내 자식 객체 / 테이블에서 foraeing 키로 사용하는 파일에 @Column (insertable = false, nullable = true)을 추가하는 것이 었습니다.
이스라엘

6

방금 솔루션이 쉬운 것과 같은 문제가있었습니다.

부모 테이블에 존재 하지 않는 자식 테이블에 ID를 추가하려고 합니다.

InnoDB에는 때때로 값을 추가하지 않고 auto_increment 열을 증가시키는 버그가 있으므로 확인하십시오. INSERT ... ON DUPLICATE KEY


진심으로? 존재하지 않는 아이디 참조를 삽입하지 않습니다 ... 단지 확인
Blaztix

5

나는 비슷한 문제가 있었다. 내용이 있고 열이 널 입력 가능하지 않은 테이블에 외래 키를 적용하려고합니다. 두 가지 옵션이 있습니다.

  1. 외래 키 제약 조건을 적용하려는 열을 Null 허용으로 만듭니다. 그렇게하면 외래 키가 일부 필드가 널 입력 가능하다는 것을 알고 적용됩니다. ( 이것이 내가 한 일입니다. )
  2. 외래 키 제약 조건을 적용 할 열을 만들고 외래 키를 열에 삽입하는 쿼리를 작성한 다음 외래 키 제약 조건을 적용합니다. ( 이 시도하지 않았지만 작동해야 함 )

4

외래 키에 삽입하는 값이 부모 테이블에 있는지 확인하십시오. 그것은 나를 도왔다. 예를 들어, 당신은 삽입 할 경우 user_id = 2table.2, 그러나 table.1이없는 user_id = 2한 다음 제약 조건 오류가 발생합니다. 내 오류 코드 # 1452는 정확합니다. 이것이 같은 문제를 가진 다른 사람들을 돕기를 바랍니다!


3

나는 같은 문제가 있었고 외래 키를 추가하기 전에 첫 번째 테이블에 행이 있었기 때문입니다.


1

나는 또한 같은 문제에 직면했고 문제는 부모 테이블 항목 값이 외래 키 테이블 값과 일치하지 않는다는 것입니다. 모든 행을 지운 후 시도하십시오.


제약 조건을 사용하려면 Table2에서 참조되는 사용자가 Table1에 이미 정의되어 있어야합니다.
sorak

1

다른 사람이 제공 한 솔루션이 작동하지 않는 경우. 그런 다음 부모 및 자식 테이블의 데이터베이스 엔진을 확인해야합니다. 제 경우에는 부모 테이블의 엔진을 "MyISAM"으로 설정하여 InnoDB로 변경했습니다.

이것이 나와 같이 붙어있는 다른 사람들을 돕기를 바랍니다.


1

데이터베이스의 계단식에 대해 ondelete 필드를 두지 않아야합니다.

따라서 onDelete 필드를 RESTRICT로 설정하십시오.

행운을 빕니다 ♥


0

또 다른 이상한 경우 나 에게이 오류가 발생했습니다. 외래 키를 id 기본 키로 잘못 참조했습니다. 잘못된 alter table 명령으로 인해 발생했습니다. INFORMATION_SCHEMA 테이블을 쿼리하여 이것을 알았습니다 (이 stackoverflow 답변 참조)

테이블이 너무 혼동되어 ALTER TABLE 명령 으로 수정할 수 없습니다 . 나는 마침내 테이블을 떨어 뜨리고 재구성했다. 이것은 integrityError를 제거했습니다.


0

어쩌면 userID열 을 추가하는 동안 특정 테이블에 대해 설정된 데이터가 있으므로 기본값이이므로 0열을 추가하지 마십시오.NOT NULL


0

또한 "자식 행을 추가하거나 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패했습니다"라는 오류가 발생했습니다. 부모 테이블에 새 행을 추가 할 때 오류가 발생했습니다.

문제는 외래 키 제약 조건이 자식 테이블 대신 부모 테이블에 정의되어 있다는 것입니다.


0

mysql 인덱스 또는 테이블 간의 관계를 사용하면 먼저 열을 삭제하고 (예 : city_id) 같은 이름으로 새 열을 만듭니다 (예 : city_id). 그런 다음 다시 시도하십시오 ...


0

테이블에 포함 된 기존 데이터가 있습니까? 그렇다면 외래 키를 추가하려는 테이블의 모든 데이터를 지우십시오. 그런 다음 코드를 다시 실행하십시오 (외래 키 추가).

이 문제가 여러 번 발생했습니다. 기존 테이블에 외래 키를 추가하려는 경우 테이블의 모든 데이터가 지워집니다.

희망이 작동 :)


0

table2의 UserID 필드 색인을 삭제하십시오. 나에게 어울리는


0

이 오류는 상위 테이블의 기본 키에 존재하지 않는 값을 가진 외래 키를 추가하려고 할 때 발생합니다. table2의 새 외래 키 UserID에 table1 기본 키에 존재하는 값이 있는지 확인해야하며 때로는 기본적으로 null이거나 0과 같습니다.

먼저 table2의 외래 키의 모든 필드를 table1의 기본 키에 존재하는 값으로 업데이트 할 수 있습니다.

update table2 set UserID = 1 where UserID is null

다른 UserID를 추가하려면 원하는 값으로 각 행을 수정해야합니다.


-1

자식 테이블 외래 키 제약 조건이 실패했습니다

이 문제는 다음과 같은 이유로 발생할 수 있습니다.

Spring mvc에서 수행하는 경우 때로는 mysql이 id 유형을 인식하지 못하기 때문에 id 유형을 명시 적으로 설명해야합니다. 따라서 엔티티 클래스의 두 테이블에서 명시 적으로 설정하십시오.@GeneratedValue (strategy = GenerationType.IDENTITY)

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