Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal

174

Tabel 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   |     |         |                |
+----------+-------------+------+-----+---------+----------------+

Meja 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   |     |         |                |
+------------------+--------------+------+-----+---------+----------------+

Kesalahan:

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`)) 

Apa yang telah saya lakukan salah? Saya membaca http://www.w3schools.com/Sql/sql_foreignkey.asp dan saya tidak melihat apa yang salah.

Tom
sumber
4
Bisakah Anda memposting pertanyaan yang memicu kesalahan?
Basah
38
Singkatnya, Anda mencoba memasukkan / memperbarui nilai table2.UserIDyang tidak ada di table1.UserID.
Joe Stefanelli
Tidak yakin mengapa tetapi setelah memindahkan basis data saya dari lingkungan windows ke Linux, saya harus menghapus dan menciptakan kembali suatu relasi (saat itulah saya melihat masalah). Nilai memang ada, tetapi menghapus dan menambahkan kembali relasi memperbaikinya. Anda mungkin harus sangat berhati-hati melakukannya.
johnsnails

Jawaban:

235

Anda mendapatkan kesalahan ini karena Anda mencoba untuk menambah / memperbarui baris table2yang tidak memiliki nilai yang valid untuk UserIDbidang berdasarkan nilai yang saat ini disimpan table1. Jika Anda memposting beberapa kode lagi, saya dapat membantu Anda mendiagnosis penyebab spesifiknya.

Brian Driscoll
sumber
PreparedStatement st = connection.prepareStatement ("Masukkan ke table2 (UserID, PostID, Judul, Ringkasan)" + "nilai (UserID,?,?,?)");
Tom
15
tidak yakin untuk apa downvote itu; jawaban saya sangat valid dan benar.
Brian Driscoll
Hmm ... itu pasti bukan ide yang baik untuk mencampur parameter bernama dengan parameter yang tidak disebutkan namanya dalam pernyataan Anda disiapkan. itu harus "nilai (?,?,?,?)" dengan nilai yang sesuai untuk UserID yang ditentukan dalam pernyataan eksekusi Anda.
Brian Driscoll
Jadi saya perlu melakukan pernyataan SQL lain untuk mendapatkan userid dari table1?
Tom
5
Kemungkinan besar 0, ganti dengan Null jika itu masalahnya
Jeffrey Nicholson Carré
123

Ini berarti bahwa Anda sedang berusaha untuk memasukkan ke table2sebuah UserIDnilai yang tidak ada di table1.

Rami C
sumber
104

Peretasan sederhana dapat menonaktifkan pemeriksaan kunci asing sebelum melakukan operasi apa pun di atas meja. Cukup kueri

SET FOREIGN_KEY_CHECKS=0

Ini akan menonaktifkan pencocokan kunci asing dengan tabel lain. Setelah Anda selesai dengan tabel, aktifkan kembali

SET FOREIGN_KEY_CHECKS=1

Ini berfungsi untuk saya banyak kali.

Sandeep Giri
sumber
Bagaimana saya MENGGUNAKAN ini ??
Sachin dari Pune
2
@SachinfromPune tambahkan saja SET FOREIGN_KEY_CHECKS = 0; pada awal file mysql dan SET FOREIGN_KEY_CHECKS = 1; pada akhir file mysql,
masukkan
1
Bukankah ini bermasalah? Anda kehilangan integritas referensial, bukan?
roadrunner66
Integritas referensial didukung oleh kehadiran entri indeks yang benar. Selama Anda memiliki kunci dan indeks yang benar, Anda harus dapat menonaktifkan pemeriksaan kunci selama input massal.
Vernon Keenan
46

Saya menemukan kasus aneh lain: Jika Anda secara tidak sengaja membuat kunci asing dari tabel InnoDB ke tabel MyISAM, MySQL melempar kesalahan ini pada saat memasukkan bahkan jika data dinyatakan valid.

Lihat http://nick.zoic.org/art/mysql-foreign-key-error/

NickZoic
sumber
1
Ya, saya memiliki masalah yang sama. Dua tabel harus InnoDB!
emeraldhieu
2
Saya memiliki masalah yang sama, terima kasih atas tipnya. Berikut ini tautan ke dokumentasi MySQL tentang cara mengonversi tabel dari MyISAM ke InnoDB dev.mysql.com/doc/refman/5.7/en/... TLDR: ALTER TABLE table_name ENGINE = InnoDB;
Guilherme Vaz
Memang, ini yang terjadi di database saya. Saya memutuskan untuk mengubah mesin MyISAM ke InnoDB. Akhirnya, saya dapat bekerja dengan database seperti yang saya inginkan.
Mike
17

Anda mendapatkan kesalahan ini karena ada beberapa nilai int table2.UserIDyang tidak ada pada table1.UserID(saya kira Anda telah menetapkan table2.UserIDnilai secara manual sebelum Anda membuat kunci asing ini).
Satu contoh untuk adegan ini: table1.UserIDdapatkan nilai 1,2,3 dan table2.UserIDdapatkan nilai 4 (tambahkan dengan manual). Jadi, ketika Anda membuat kunci asing, mereka tidak dapat menemukan UserID = 4dari table1dan kesalahan akan ocurse.
Untuk memperbaiki kesalahan ini, hanya menghapus UserID = 4dari table2atau Anda dapat mengosongkan keduanya dan kemudian membuat kunci asing dan.
Semoga berhasil!

Justin
sumber
11

Saya butuh waktu beberapa saat untuk mencari tahu. Sederhananya, tabel yang mereferensikan tabel lain sudah memiliki data di dalamnya dan satu atau lebih nilainya tidak ada di tabel induk.

misalnya Table2 memiliki data berikut:

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

Tabel 1

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

Jika Anda mencoba untuk mengubah tabel2 dan menambahkan kunci asing maka permintaan akan gagal karena UserID = 5 tidak ada di Table1.

Sbudah
sumber
10

Jika Anda telah memasukkan baris ke tabel 1 sebelum membuat kunci asing di tabel 2, maka Anda akan mendapatkan kesalahan batasan kunci asing, karena nilai kenaikan otomatis 2 di tabel 1 dan 1 di tabel 2. Untuk menyelesaikan ini, Anda harus potong tabel 1 dan atur kembali nilai kenaikan otomatis ke 1. Lalu Anda bisa menambahkan tabel 2.

Attaque
sumber
10

Pastikan Anda telah menyetel mesin basis data ke InnoDB karena dalam kunci asing MyISAM dan transaksi tidak didukung

Aman Maurya
sumber
2
ALTER TABLE my_table ENGINE = InnoDB;
Bishwas Mishra
7

Hanya sedikit perbaikan: Buatlah JoinColumn 'nullable = true' di Table1 dan 'UserID' field 'insertable = false' dan 'nullable = true' di Table2.

Dalam Table1 Entity:

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

Dalam Table2 Entity:

@Column(insertable = false, nullable = true)
private int UserID;
Ujjwal Chaudhary
sumber
Jawaban ini benar-benar menyelesaikan masalah saya, terima kasih banyak telah berbagi ini. Kunci untuk saya adalah menambahkan @Column (insertable = false, nullable = true) pada file yang saya gunakan sebagai kunci foraeing pada objek / tabel anak saya.
Israel
6

Saya hanya punya masalah yang sama solusinya mudah.

Anda mencoba menambahkan id di tabel anak yang tidak ada di tabel induk.

periksa dengan baik, karena InnoDB memiliki bug yang terkadang meningkatkan kolom auto_increment tanpa menambahkan nilai, misalnya, INSERT ... ON DUPLICATE KEY

Blaztix
sumber
serius? jangan masukkan referensi id yang tidak ada ... cukup centang
Blaztix
5

Saya punya masalah serupa. Anda mencoba menerapkan kunci asing pada tabel yang memiliki konten dan kolom tidak dapat dibatalkan. Anda memiliki dua opsi.

  1. Buat kolom di mana Anda ingin menerapkan batasan kunci asing agar dapat dibatalkan. Dengan begitu kunci asing akan berlaku mengetahui bahwa beberapa bidang dapat dibatalkan. ( Inilah yang saya lakukan. )
  2. Buat kolom tempat Anda ingin menerapkan batasan kunci asing, tulis kueri untuk memasukkan kunci asing ke dalam kolom dan kemudian terapkan batasan kunci asing. ( Tidak mencoba ini tetapi seharusnya berhasil )
Yakub
sumber
4

Pastikan nilai yang Anda masukkan ke kunci asing ada di tabel induk. Itu membantu saya. Misalnya jika Anda memasukkan user_id = 2ke dalam table.2, tetapi table.1tidak memiliki user_id = 2, maka kendala akan menimbulkan kesalahan. Milik saya adalah kode kesalahan # 1452 tepatnya. Semoga ini bisa membantu orang lain dengan masalah yang sama!

Dustin Hammack
sumber
3

Saya memiliki masalah yang sama, dan alasannya adalah saya memiliki baris di tabel pertama sebelum menambahkan kunci asing.

Ouissal
sumber
1

Saya juga menghadapi masalah yang sama dan masalahnya adalah nilai entri tabel orang tua saya tidak cocok dengan nilai tabel kunci asing. Jadi silakan coba setelah menghapus semua baris ..

Justin Jose
sumber
Batasan mengharuskan pengguna yang dirujuk dalam Table2 harus sudah didefinisikan dalam Table1.
sorak
1

Dalam hal jika solusi yang diberikan oleh orang lain tidak berhasil. Maka Anda harus mencoba memeriksa Mesin Database dari Tabel Induk dan Anak. Dalam kasus saya, saya memiliki mesin tabel orangtua diatur ke "MyISAM", mengubahnya ke InnoDB memperbaikinya.

Semoga ini bisa membantu orang lain yang terjebak seperti saya.

Arun Shankar
sumber
1

Anda tidak harus meletakkan bidang ondelete terhadap kaskade di database.

Jadi setel bidang onDelete ke RESTRICT

Semoga beruntung ♥

HamidReza Biglari
sumber
0

Namun kasus aneh lain yang memberi saya kesalahan ini. Saya telah salah merujuk kunci asing saya ke kunci utama id. Ini disebabkan oleh perintah alter tabel yang salah. Saya menemukan ini dengan menanyakan tabel INFORMATION_SCHEMA (Lihat jawaban stackoverflow ini)

Tabelnya sangat membingungkan sehingga tidak bisa diperbaiki oleh perintah ALTER TABLE . Saya akhirnya menjatuhkan meja dan membangunnya kembali. Ini menghilangkan integrityError.

Vicky T
sumber
0

Mungkin saat Anda menambahkan userIDkolom, ada data untuk tabel tertentu yang dibuat sehingga akan memiliki nilai default 0, coba tambahkan kolom tanpaNOT NULL

WTFZane
sumber
0

Saya juga mendapatkan kesalahan ini: "Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal". Saya mendapat kesalahan saat menambahkan baris baru ke tabel induk

Masalahnya adalah batasan kunci asing telah didefinisikan pada tabel induk alih-alih tabel anak.

Nadir Latif
sumber
0

Jika Anda menggunakan indeks mysql atau hubungan antar tabel, pertama-tama Anda menghapus kolom (misalnya: city_id) dan membuat kolom baru dengan nama yang sama (misalnya: city_id). Lalu coba lagi ...

Mahmut Aydın
sumber
0

Apakah ada data yang ada di tabel tersebut? Jika demikian, coba hapus semua data dalam tabel yang ingin Anda tambahkan kunci asing. Kemudian jalankan kode (tambahkan kunci asing) lagi.

Saya mengalami masalah ini berkali-kali. Ini membersihkan semua data dalam tabel berfungsi saat Anda ingin menambahkan kunci asing pada tabel yang ada.

Semoga ini berhasil :)

Noldy
sumber
0

Hapus indeks bidang UserID dari table2. Cocok untukku

Anton
sumber
-1

batasan kunci asing tabel anak gagal

Masalah ini dapat meningkat karena alasan berikut:

Jika Anda melakukannya di Spring mvc, Anda perlu menjelaskan jenis id secara eksplisit, karena terkadang mysql gagal mengenali tipe id. jadi Anda secara eksplisit mengatur seperti di kedua tabel di kelas entitas Anda@GeneratedValue (strategy = GenerationType.IDENTITY)

Qaiser Iqbal Moeeni
sumber