INSERT ... ON DUPLICATE KEY (tidak melakukan apa-apa)

184

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 

?

Uhk
sumber

Jawaban:

332

Ya, gunakan INSERT ... ON DUPLICATE KEY UPDATE id=id(itu tidak akan memicu pembaruan baris meskipun idditugaskan untuk dirinya sendiri).

Jika Anda tidak peduli tentang kesalahan (kesalahan konversi, kesalahan kunci asing) dan kelelahan bidang peningkatan otomatis (bertambah meskipun baris tidak dimasukkan karena kunci duplikat), kemudian gunakan INSERT IGNORE.

ceejayoz
sumber
5
hanya untuk menambahkan IGNORE setelah INSERT, sisa sintaksnya sama?
ufk
25
@ufk: INSERT IGNOREtanpa ON DUPLICATE KEYbagian, misalnyaINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock
125
Perhatikan bahwa INSERT IGNORE juga mengabaikan kesalahan lain seperti kegagalan konversi data.
mjcopple
36
jadi saya akan menggunakan ON DUPLICATE KEY UPDATE id = id. saya hanya ingin mengabaikan duplikat kunci bukan jenis kesalahan lainnya.
ufk
7
berhati-hatilah. INSERT IGNORE akan menambah kolom kenaikan otomatis meskipun baris tidak dimasukkan
WorM
9

BAGAIMANA CARA MELAKSANAKAN 'masukkan jika tidak ada'?

1. REPLACE INTO

pro:

  1. sederhana.

kontra:

  1. terlalu lambat.

  2. kunci kenaikan otomatis akan MENGUBAH (bertambah 1) jika ada entri yang cocok unique keyatau primary key, karena menghapus entri yang lama kemudian memasukkan yang baru.

2. INSERT IGNORE

pro:

  1. sederhana.

kontra:

  1. kunci kenaikan otomatis tidak akan berubah jika ada kecocokan entri unique keyatau primary keytetapi indeks kenaikan otomatis akan meningkat sebesar 1

  2. beberapa kesalahan / peringatan lainnya akan diabaikan seperti kesalahan konversi data.

3. INSERT ... ON DUPLICATE KEY UPDATE

pro:

  1. Anda dapat dengan mudah menerapkan fungsi 'simpan atau perbarui' dengan ini

kontra:

  1. terlihat relatif kompleks jika Anda hanya ingin memasukkan tidak memperbarui.

  2. kunci kenaikan otomatis tidak akan berubah jika ada kecocokan entri unique keyatau primary keytetapi indeks kenaikan otomatis akan meningkat sebesar 1

4. Adakah cara untuk menghentikan peningkatan kunci otomatis jika ada kecocokan entri unique keyatau primary key?

Seperti disebutkan dalam komentar di bawah oleh @toien: "kolom kenaikan otomatis akan dipengaruhi tergantung pada innodb_autoinc_lock_modekonfigurasi setelah versi 5.1" jika Anda menggunakan innodbsebagai mesin Anda, tetapi ini juga mempengaruhi konkurensi, sehingga perlu dipertimbangkan sebelum digunakan. Sejauh ini saya tidak melihat solusi yang lebih baik.

Kim
sumber
Kolom penambahan otomatis akan dipengaruhi tergantung pada innodb_autoinc_lock_modekonfigurasi setelah versi 5.1
toien
1

Gunakan ON DUPLICATE KEY UPDATE ...,
Negatif: karena UPDATEmenggunakan 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.

Abdul Aziz Al Basyir
sumber
@ Jabul apakah ada dukungan mysql apa yang Anda jelaskan di sini?
Lalit Tarsariya