Ketika melakukan:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Kesalahan:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Ini meja saya:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
Cara sederhana adalah dengan menonaktifkan pemeriksaan kunci asing; lakukan perubahan lalu aktifkan kembali pemeriksaan kunci asing.
sumber
REPLACE INTO tab_with_constraint ...
Di bawah desain Anda saat ini (mungkin cacat), Anda harus menghapus baris dari tabel pengiklan sebelum Anda dapat menghapus baris di tabel pekerjaan yang dirujuk.
Atau, Anda bisa mengatur kunci asing Anda sehingga penghapusan di tabel induk menyebabkan baris dalam tabel anak dihapus secara otomatis. Ini disebut penghapusan cascading. Itu terlihat seperti ini:
Karena itu, seperti yang telah ditunjukkan orang lain, kunci asing Anda terasa seperti itu harus berbalik karena tabel pengiklan benar-benar berisi kunci utama dan tabel pekerjaan berisi kunci asing. Saya akan menulis ulang seperti ini:
Dan penghapusan cascading tidak akan diperlukan.
sumber
Jika Anda ingin menjatuhkan tabel, Anda harus menjalankan kueri berikut dalam satu langkah
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE table_name;
sumber
Saya mencoba solusi yang disebutkan oleh @Alino Manzi tetapi tidak berhasil bagi saya di tabel terkait WordPress menggunakan wpdb.
kemudian saya memodifikasi kode seperti di bawah ini dan berhasil
sumber
Saya pikir kunci asing Anda terbalik. Mencoba:
sumber
Jika ada lebih dari satu pekerjaan yang memiliki advertiser_id yang sama, maka kunci asing Anda seharusnya:
Kalau tidak (jika sebaliknya dalam kasus Anda), jika Anda ingin baris pengiklan dihapus secara otomatis jika baris dalam pekerjaan dihapus tambahkan opsi 'ON DELETE CASCADE' di akhir kunci asing Anda:
Lihat batasan Kunci Asing
sumber
Anda perlu menghapusnya berdasarkan pesanan. Ada ketergantungan pada tabel
sumber
Saat Anda membuat database atau membuat tabel
Anda harus menambahkan baris itu di skrip atas, buat database atau tabel
Sekarang Anda ingin menghapus catatan dari tabel? maka Anda menulis sebagai
Semoga berhasil!
sumber
Bagaimana dengan alternatif ini yang telah saya gunakan: izinkan kunci asing menjadi NULL dan kemudian pilih ON DELETE SET NULL .
Secara pribadi saya lebih suka menggunakan " ON UPDATE CASCADE " serta " ON DELETE SET NULL " untuk menghindari komplikasi yang tidak perlu, tetapi pada pengaturan Anda, Anda mungkin menginginkan pendekatan yang berbeda. Selain itu, NULL'ing nilai kunci asing dapat menyebabkan komplikasi karena Anda tidak akan tahu apa yang sebenarnya terjadi di sana. Jadi perubahan ini harus terkait erat dengan cara kerja kode aplikasi Anda.
Semoga ini membantu.
sumber
Saya punya masalah dalam migrasi laravel juga
urutan drop table dalam metode () tidak masalah
mungkin tidak berfungsi, tetapi jika Anda mengubah urutannya, itu berfungsi.
sumber
jika Anda perlu mendukung klien sesegera mungkin, dan tidak memiliki akses ke
sehingga integritas data dapat dinonaktifkan:
1) hapus kunci asing
2) aktifkan operasi penghapusan Anda melalui sql atau api
3) tambahkan kunci asing kembali ke skema
namun, ini merupakan hot-fix, jadi ini adalah risiko Anda sendiri, karena kelemahan utama dari pendekatan semacam itu adalah diperlukan setelah itu untuk menjaga integritas data secara manual.
sumber
Anda bisa membuat pemicu untuk menghapus baris yang direferensikan sebelum menghapus pekerjaan.
sumber
Masalah utama dengan erorr ini
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
adalah ia tidak memberi tahu Anda tabel mana yang berisi kegagalan FK, sehingga sulit untuk menyelesaikan konflik.Jika Anda menggunakan MySQL atau yang serupa, saya menemukan bahwa Anda dapat membuat diagram ER untuk database Anda, maka Anda dapat meninjau dan menghapus konflik yang memicu kesalahan dengan aman.
connection
database
&tables
yang perlu diperiksasumber
Pada dasarnya, Alasan di balik jenis kesalahan ini adalah pada akhirnya Anda mencoba untuk menghapus tupple yang memiliki kunci utama (tabel akar) & bahwa kunci utama digunakan dalam tabel anak sebagai kunci asing. Dalam skenario ini untuk menghapus data tabel induk Anda harus menghapus data tabel anak (di mana kunci asing digunakan). Terima kasih
sumber
Ini terjadi pada saya juga dan karena ketergantungan dan referensi dari tabel lain, saya tidak bisa menghapus entri. Apa yang saya lakukan adalah menambahkan kolom hapus (dari tipe boolean) ke tabel. Nilai di bidang itu menunjukkan apakah item ditandai untuk dihapus atau tidak. Jika ditandai untuk dihapus, jangan mengambil / menggunakan; jika tidak, gunakan itu.
sumber
Mungkin Anda harus mencoba ON DELETE CASCADE
sumber