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


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 = 2에 table.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.