- Menggunakan
INSERT IGNORE
- Menggunakan
REPLACE
- Menggunakan
INSERT ... ON DUPLICATE KEY UPDATE
MySQL menyediakan sejumlah pernyataan yang berguna ketika diperlukan untuk INSERT
baris setelah menentukan apakah baris tersebut sebenarnya baru atau sudah ada.
Di bawah ini kami akan memeriksa tiga metode yang berbeda dan menjelaskan pro dan kontra dari masing-masing secara bergantian sehingga Anda memiliki pemahaman yang kuat tentang cara mengonfigurasi pernyataan Anda sendiri saat memberikan data baru atau yang berpotensi sudah ada untuk INSERTION
.
Menggunakan INSERT IGNORE
Menggunakan INSERT IGNORE
secara efektif menyebabkan MySQL mengabaikan kesalahan eksekusi saat mencoba melakukan INSERT
pernyataan. Ini berarti bahwa INSERT IGNORE
pernyataan yang berisi nilai duplikat dalam UNIQUE
indeks atau PRIMARY KEY
bidang tidak menghasilkan kesalahan, tetapi sebaliknya akan mengabaikan INSERT
tertentu itu perintah sepenuhnya. Tujuan yang jelas adalah untuk mengeksekusi sejumlah besar INSERT
pernyataan untuk kombinasi data yang sudah ada di database maupun data baru yang masuk ke sistem.
Misalnya, books
. kami tabel mungkin sudah berisi beberapa catatan:
mysql> SELECT * FROM books LIMIT 3;
+----+-------------------------+---------------------+----------------+
| id | title | author | year_published |
+----+-------------------------+---------------------+----------------+
| 1 | In Search of Lost Time | Marcel Proust | 1913 |
| 2 | Ulysses | James Joyce | 1922 |
| 3 | Don Quixote | Miguel de Cervantes | 1605 |
+----+-------------------------+---------------------+----------------+
3 rows in set (0.00 sec)
Jika kita memiliki banyak data baru dan yang sudah ada untuk INSERT
dan bagian dari data itu berisi nilai yang cocok untuk id
bidang (yang merupakan UNIQUE
PRIMARY_KEY
dalam tabel), menggunakan INSERT
basic dasar akan menghasilkan kesalahan yang diharapkan:
mysql> INSERT INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
Sebaliknya, jika kita menggunakan INSERT IGNORE
, upaya duplikasi diabaikan dan tidak ada kesalahan yang terjadi:
mysql> INSERT IGNORE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 0 rows affected (0.00 sec)
Menggunakan REPLACE
Jika Anda benar-benar ingin mengganti baris di mana INSERT
perintah akan menghasilkan kesalahan karena duplikat UNIQUE
atau PRIMARY KEY
nilai seperti diuraikan di atas, salah satu opsi adalah memilih REPLACE
pernyataan.
Saat mengeluarkan REPLACE
pernyataan, ada dua kemungkinan hasil untuk setiap perintah yang dikeluarkan:
- Tidak ada baris data yang ditemukan dengan nilai yang cocok dan dengan demikian menjadi
INSERT
standar pernyataan dilakukan. - Baris data yang cocok adalah ditemukan, menyebabkan baris yang ada dihapus dengan standar
DELETE
pernyataan, laluINSERT
normal yang normal dilakukan sesudahnya.
Misalnya, kita dapat menggunakan REPLACE
untuk menukar catatan id = 1
kami yang ada dari Mencari Waktu yang Hilang oleh Marcel Proust dengan Telur Hijau dan Ham oleh Dr. Seuss:
mysql> REPLACE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 2 rows affected (0.00 sec)
Perhatikan bahwa meskipun kita hanya mengubah satu baris, hasilnya menunjukkan bahwa dua baris terpengaruh karena kami sebenarnya DELETED
baris yang ada lalu INSERTED
baris baru untuk menggantikannya.
Informasi lebih lanjut tentang menggunakan REPLACE
dapat ditemukan di dokumentasi resmi.
Menggunakan INSERT ... ON DUPLICATE KEY UPDATE
Metode alternatif (dan umumnya lebih disukai) untuk INSERTING
menjadi baris yang mungkin berisi duplikat UNIQUE
atau PRIMARY KEY
nilainya adalah dengan menggunakan INSERT ... ON DUPLICATE KEY UPDATE
pernyataan dan klausa.
Tidak seperti REPLACE
– perintah yang secara inheren merusak karena DELETE
perintah yang dijalankannya bila perlu – menggunakan INSERT ... ON DUPLICATE KEY UPDATE
adalah tidak merusak , karena itu hanya akan mengeluarkan INSERT
atau UPDATE
pernyataan, tetapi jangan pernah DELETE
.
Misalnya, kami telah memutuskan untuk mengganti id = 1
catatan Telur Hijau dan Ham dan kembalikan ke aslinya In Search of Lost Time merekam sebagai gantinya. Oleh karena itu, kami dapat mengambil INSERT
asli kami pernyataan dan tambahkan ON DUPLICATE KEY UPDATE
baru klausa:
mysql> SET @id = 1,
@title = 'In Search of Lost Time',
@author = 'Marcel Proust',
@year_published = 1913;
INSERT INTO books
(id, title, author, year_published)
VALUES
(@id, @title, @author, @year_published)
ON DUPLICATE KEY UPDATE
title = @title,
author = @author,
year_published = @year_published;
Perhatikan bahwa kami menggunakan UPDATE
normal sintaks (tetapi tidak termasuk table
yang tidak perlu nama dan SET
kata kunci), dan hanya menetapkan non-UNIQUE
nilai-nilai. Juga, meskipun tidak perlu untuk ON DUPLICATE KEY UPDATE
agar berfungsi dengan baik, kami juga memilih untuk menggunakan user variables
jadi kita tidak perlu menentukan nilai sebenarnya yang ingin kita INSERT
atau UPDATE
lebih dari sekali.
Hasilnya, id = 1
catatan dengan benar UPDATED
seperti yang diharapkan:
mysql> SELECT * FROM books LIMIT 1;
+----+------------------------+---------------+----------------+
| id | title | author | year_published |
+----+------------------------+---------------+----------------+
| 1 | In Search of Lost Time | Marcel Proust | 1913 |
+----+------------------------+---------------+----------------+
1 row in set (0.00 sec)
Informasi lebih lanjut dapat ditemukan di dokumentasi resmi.