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.
table2.UserID
yang tidak ada ditable1.UserID
.Jawaban:
Anda mendapatkan kesalahan ini karena Anda mencoba untuk menambah / memperbarui baris
table2
yang tidak memiliki nilai yang valid untukUserID
bidang berdasarkan nilai yang saat ini disimpantable1
. Jika Anda memposting beberapa kode lagi, saya dapat membantu Anda mendiagnosis penyebab spesifiknya.sumber
Ini berarti bahwa Anda sedang berusaha untuk memasukkan ke
table2
sebuahUserID
nilai yang tidak ada ditable1
.sumber
Peretasan sederhana dapat menonaktifkan pemeriksaan kunci asing sebelum melakukan operasi apa pun di atas meja. Cukup kueri
Ini akan menonaktifkan pencocokan kunci asing dengan tabel lain. Setelah Anda selesai dengan tabel, aktifkan kembali
Ini berfungsi untuk saya banyak kali.
sumber
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/
sumber
Anda mendapatkan kesalahan ini karena ada beberapa nilai int
table2.UserID
yang tidak ada padatable1.UserID
(saya kira Anda telah menetapkantable2.UserID
nilai secara manual sebelum Anda membuat kunci asing ini).Satu contoh untuk adegan ini:
table1.UserID
dapatkan nilai 1,2,3 dantable2.UserID
dapatkan nilai 4 (tambahkan dengan manual). Jadi, ketika Anda membuat kunci asing, mereka tidak dapat menemukanUserID = 4
daritable1
dan kesalahan akan ocurse.Untuk memperbaiki kesalahan ini, hanya menghapus
UserID = 4
daritable2
atau Anda dapat mengosongkan keduanya dan kemudian membuat kunci asing dan.Semoga berhasil!
sumber
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:
Tabel 1
Jika Anda mencoba untuk mengubah tabel2 dan menambahkan kunci asing maka permintaan akan gagal karena UserID = 5 tidak ada di Table1.
sumber
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.
sumber
Pastikan Anda telah menyetel mesin basis data ke InnoDB karena dalam kunci asing MyISAM dan transaksi tidak didukung
sumber
Hanya sedikit perbaikan: Buatlah JoinColumn 'nullable = true' di Table1 dan 'UserID' field 'insertable = false' dan 'nullable = true' di Table2.
Dalam Table1 Entity:
Dalam Table2 Entity:
sumber
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
sumber
Saya punya masalah serupa. Anda mencoba menerapkan kunci asing pada tabel yang memiliki konten dan kolom tidak dapat dibatalkan. Anda memiliki dua opsi.
sumber
Pastikan nilai yang Anda masukkan ke kunci asing ada di tabel induk. Itu membantu saya. Misalnya jika Anda memasukkan
user_id = 2
ke dalamtable.2
, tetapitable.1
tidak memilikiuser_id = 2
, maka kendala akan menimbulkan kesalahan. Milik saya adalah kode kesalahan # 1452 tepatnya. Semoga ini bisa membantu orang lain dengan masalah yang sama!sumber
Saya memiliki masalah yang sama, dan alasannya adalah saya memiliki baris di tabel pertama sebelum menambahkan kunci asing.
sumber
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 ..
sumber
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.
sumber
Anda tidak harus meletakkan bidang ondelete terhadap kaskade di database.
Jadi setel bidang onDelete ke RESTRICT
Semoga beruntung ♥
sumber
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.
sumber
Mungkin saat Anda menambahkan
userID
kolom, ada data untuk tabel tertentu yang dibuat sehingga akan memiliki nilai default0
, coba tambahkan kolom tanpaNOT NULL
sumber
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.
sumber
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 ...
sumber
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 :)
sumber
Hapus indeks bidang UserID dari table2. Cocok untukku
sumber
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)
sumber