Gandakan dan Abaikan pada Sisipan MySQL

Kekunci utama jadual MySQL dan indeks unik menghalang berbilang baris dengan indeks yang sama ditambahkan ke jadual. Sekiranya anda cuba memasukkan baris pendua dengan pernyataan INSERT standard, anda akan mengalami ralat dan sisipan akan gagal.

MySQL menyediakan beberapa alternatif untuk pernyataan INSERT standard dan masing-masing mengendalikan baris pendua sedikit berbeza: "MASUKKAN KE ATAS," "INSERT ... ON DUPLICATE KEY UPDATE," dan "REPLACE"

Kunci Utama dan Indeks Unik

Kekangan indeks utama utama dan kekangan indeks "UNIK" memerlukan setiap baris mengandungi nilai unik dalam lajur indeks, yang membolehkan setiap baris dikenali oleh kunci utamanya atau nilai dalam lajur kekangan indeks UNIK.

Sekiranya INSERT biasa cuba memasukkan baris yang mengandungi nilai pendua dalam kunci utama atau indeks kekangan UNIK, sisipan akan gagal, mungkin akan mengembalikan keseluruhan transaksi.

MASUKKAN JADI

INSERT IGNORE akan memasukkan baris dengan cara yang sama seperti INSERT, tetapi dengan pengecualian bahawa ia akan mengabaikan baris dengan nilai pendua dan meneruskan pelaksanaan tanpa membuat ralat. Sebarang baris yang mengandungi nilai pendua tidak akan dimasukkan; sebagai contoh:

INSERT IGNORE INTO my_table (unique_index_column, other_column) NILAI (1, 'nilai lain');

MASUKKAN ... PADA KEMASKINI DUPLIKAT

INSERT ... ON DUPLICATE KEY UPDATE akan memasukkan sebarang baris bukan pendua seperti biasa. Walau bagaimanapun, apabila menemui baris pendua, ia akan melakukan UPDATE pada baris asal; sebagai contoh:

INSERT INTO my_table (unique_index_column, other_column) NILAI (1, 'nilai lain') PADA DUPLICATE KEY UPDATE other_column = 'duplikat kemas kini nilai';

GANTI

REPLACE berfungsi sama seperti INSERT, kecuali apabila bertemu baris pendua, ia akan menghapus baris asal dan kemudian dilanjutkan dengan sisipan. Mana-mana baris dengan nilai indeks unik pendua akan menggantikan baris yang pada awalnya mengandungi nilai; sebagai contoh:

GANTI KE DALAM my_table (kolum_index_koleksi, kolom_lain_NILAI) NILAI (1, 'nilai lain')