Ketika melakukan:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Itu 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))
Berikut ini adalah tabel 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 untuk menonaktifkan foreign key check; membuat perubahan yang kemudian mengaktifkan kembali foreign key check.
SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them
Seperti, anda harus menghapus baris dari pengiklan meja sebelum anda dapat menghapus baris dalam tabel jobs itu referensi. Ini:
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`)
REFERENCES `jobs` (`advertiser_id`);
...adalah benar-benar berlawanan dengan apa yang seharusnya. Seperti itu, itu berarti bahwa anda'a harus memiliki sebuah record dalam tabel jobs sebelum pengiklan. Jadi, anda perlu untuk menggunakan:
ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`)
REFERENCES `advertisers` (`advertiser_id`);
Setelah anda memperbaiki hubungan kunci asing, anda menghapus pernyataan akan bekerja.
Di bawah anda saat ini (mungkin cacat) desain, anda harus menghapus baris dari pengiklan tabel sebelum anda dapat menghapus baris dalam tabel jobs itu referensi.
Atau, anda bisa mengatur kunci asing seperti yang hapus di tabel orangtua penyebab baris dalam tabel anak yang akan dihapus secara otomatis. Ini disebut cascading delete. Ini terlihat seperti ini:
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;
Karena itu, sebagai orang lain telah menunjukkan, anda foreign key merasa seperti itu harus pergi dengan cara lain ada sejak pengiklan meja benar-benar berisi primary key dan tabel jobs berisi foreign key. Saya akan menuliskannya seperti ini:
ALTER TABLE `jobs`
ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`);
Dan cascading delete won't perlu.
Jika ada lebih dari satu pekerjaan yang sama memiliki advertiser_id, maka anda foreign key harus:
ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`)
REFERENCES `advertisers` (`advertiser_id`);
Jika tidak (jika sebaliknya dalam kasus anda), jika anda ingin baris di pemasang iklan akan otomatis dihapus jika baris di pekerjaan dihapus tambahkan 'ON DELETE CASCADE' pilihan untuk akhir anda foreign key:
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`)
REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;
Check out constraint Foreign Key
Aku punya masalah ini di laravel migrasi terlalu
perintah drop tabel di bawah() metode tidak peduli
Schema::dropIfExists('groups');
Schema::dropIfExists('contact');
mungkin tidak bekerja, tetapi jika anda mengubah urutan, ia bekerja.
Schema::dropIfExists('contact');
Schema::dropIfExists('groups');
Ketika anda membuat database atau membuat tabel
Anda harus menambahkan baris di atas script membuat database atau tabel
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
Sekarang anda ingin menghapus data dari tabel? kemudian anda menulis sebagai
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Good luck!
Bagaimana dengan alternatif ini aku've telah menggunakan: memungkinkan kunci asing untuk menjadi NULL dan kemudian pilih ON DELETE SET NULL.
Secara pribadi saya lebih memilih menggunakan kedua "ON UPDATE CASCADE" serta "ON DELETE SET NULL" untuk menghindari komplikasi yang tidak perlu, tetapi pada set up anda mungkin ingin pendekatan yang berbeda. Juga, NULL'ing kunci asing nilai-nilai yang mungkin terakhir menyebabkan komplikasi seperti anda memenangkan't tahu apa yang sebenarnya terjadi di sana. Sehingga perubahan ini harus di dekat kaitannya dengan bagaimana kode aplikasi anda bekerja.
Semoga ini bisa membantu.
jika anda perlu dukungan klien secepat mungkin, dan tidak memiliki akses ke
FOREIGN_KEY_CHECKS
sehingga integritas data dapat dinonaktifkan:
ALTER TABLE `advertisers`
DROP FOREIGN KEY `advertisers_ibfk_1`;
mengaktifkan menghapus operasi melalui sql atau api
menambahkan foreign key kembali ke skema
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
namun, itu adalah panas-fix, jadi hal ini pada risiko anda sendiri, karena kelemahan utama dari pendekatan tersebut adalah bahwa hal itu diperlukan setelah itu untuk menjaga integritas data secara manual.
Aku mencoba solusi yang disebutkan oleh @Alino Manzi tetapi didn't bekerja untuk saya di WordPress yang terkait tabel menggunakan wpdb.
kemudian saya modifikasi kode seperti di bawah ini dan itu bekerja
SET FOREIGN_KEY_CHECKS=OFF; //disabling foreign key
//run the queries which are giving foreign key errors
SET FOREIGN_KEY_CHECKS=ON; // enabling foreign key
Anda bisa membuat trigger untuk menghapus dirujuk baris di sebelum menghapus pekerjaan.
DELIMITER $$
CREATE TRIGGER before_jobs_delete
BEFORE DELETE ON jobs
FOR EACH ROW
BEGIN
delete from advertisers where advertiser_id=OLD.advertiser_id;
END$$
DELIMITER ;
Masalah utama dengan ini error Error Kode: 1451. Tidak dapat menghapus atau update a parent row: a foreign key constraint fails
adalah bahwa hal itu doesn't membiarkan anda tahu tabel yang berisi FK kegagalan, sehingga sulit untuk memecahkan konflik.
Jika anda menggunakan MySQL atau serupa, saya menemukan bahwa anda dapat membuat ER diagram untuk database anda, maka anda dapat meninjau dan aman menghapus setiap konflik yang memicu kesalahan.
koneksi
database
& tabel
yang perlu memeriksa