Saya punya tabel dengan kunci unik untuk dua kolom:
CREATE TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );
Saya ingin memasukkan baris ke tabel itu, tetapi jika kuncinya ada, jangan lakukan apa pun! Saya tidak ingin kesalahan dihasilkan karena kunci ada.
Saya tahu bahwa ada sintaks berikut:
INSERT ... ON DUPLICATE KEY UPDATE ...
tetapi apakah ada sesuatu seperti:
INSERT ... ON DUPLICATE KEY DO NOTHING
?
mysql
sql
unique-key
Uhk
sumber
sumber
INSERT IGNORE
tanpaON DUPLICATE KEY
bagian, misalnyaINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BAGAIMANA CARA MELAKSANAKAN 'masukkan jika tidak ada'?
1.
REPLACE INTO
pro:
kontra:
terlalu lambat.
kunci kenaikan otomatis akan MENGUBAH (bertambah 1) jika ada entri yang cocok
unique key
atauprimary key
, karena menghapus entri yang lama kemudian memasukkan yang baru.2.
INSERT IGNORE
pro:
kontra:
kunci kenaikan otomatis tidak akan berubah jika ada kecocokan entri
unique key
atauprimary key
tetapi indeks kenaikan otomatis akan meningkat sebesar 1beberapa kesalahan / peringatan lainnya akan diabaikan seperti kesalahan konversi data.
3.
INSERT ... ON DUPLICATE KEY UPDATE
pro:
kontra:
terlihat relatif kompleks jika Anda hanya ingin memasukkan tidak memperbarui.
kunci kenaikan otomatis tidak akan berubah jika ada kecocokan entri
unique key
atauprimary key
tetapi indeks kenaikan otomatis akan meningkat sebesar 14. Adakah cara untuk menghentikan peningkatan kunci otomatis jika ada kecocokan entri
unique key
atauprimary key
?Seperti disebutkan dalam komentar di bawah oleh @toien: "kolom kenaikan otomatis akan dipengaruhi tergantung pada
innodb_autoinc_lock_mode
konfigurasi setelah versi 5.1" jika Anda menggunakaninnodb
sebagai mesin Anda, tetapi ini juga mempengaruhi konkurensi, sehingga perlu dipertimbangkan sebelum digunakan. Sejauh ini saya tidak melihat solusi yang lebih baik.sumber
innodb_autoinc_lock_mode
konfigurasi setelah versi 5.1Gunakan
ON DUPLICATE KEY UPDATE ...
,Negatif: karena
UPDATE
menggunakan sumber daya untuk tindakan kedua.Gunakan
INSERT IGNORE ...
,Negatif: MySQL tidak akan menampilkan kesalahan jika terjadi kesalahan, jadi Anda tidak dapat menangani kesalahan tersebut. Gunakan hanya jika Anda tidak peduli dengan kueri.
sumber