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 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 ada untuk
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'
0Menggunakan INSERT IGNORE
Menggunakan INSERT IGNORE
secara efektif menyebabkan MySQL mengabaikan kesalahan eksekusi saat mencoba melakukan pernyataan INSERT
. Ini berarti bahwa pernyataan INSERT IGNORE
yang berisi nilai duplikat dalam indeks
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'
5 atau bidang 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'
6 tidak menghasilkan kesalahan, melainkan hanya akan mengabaikan perintah INSERT
tersebut sepenuhnya. Tujuan yang jelas adalah untuk mengeksekusi sejumlah besar pernyataan INSERT
untuk kombinasi data yang sudah ada di database serta data baru yang masuk ke sistemMisalnya, tabel
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'
_9 kita mungkin sudah berisi beberapa recordmysql> 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 sejumlah besar data baru dan yang sudah ada untuk INSERT
dan sebagian dari data tersebut berisi nilai yang cocok untuk bidang
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]
1 [yang merupakan 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'
5 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]
3 dalam tabel], menggunakan INSERT
dasar akan menghasilkan kesalahan yang diharapkanmysql> 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'
Di sisi lain, jika kita menggunakan INSERT IGNORE
, upaya duplikasi diabaikan dan tidak terjadi kesalahan yang dihasilkan
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 ingin benar-benar mengganti baris di mana perintah INSERT
akan menghasilkan kesalahan karena duplikat
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'
5 atau 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'
6 nilai seperti yang diuraikan di atas, satu opsi adalah memilih pernyataan REPLACE
Saat mengeluarkan pernyataan REPLACE
_, ada dua kemungkinan hasil untuk setiap perintah yang dikeluarkan
- Tidak ada baris data yang ditemukan dengan nilai yang cocok dan dengan demikian pernyataan
INSERT
standar dilakukan - Baris data yang cocok ditemukan, menyebabkan baris yang ada dihapus dengan pernyataan
3 standar, kemudianmysql> 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]
INSERT
normal dilakukan setelahnya
Misalnya, kita dapat menggunakan REPLACE
untuk menukar catatan kita yang ada
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]
6 dari In Search of Lost Time oleh Marcel Proust dengan Green Eggs and Ham oleh Dr. Seussmysql> 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 kita sebenarnya
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]
7 baris yang ada lalu 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]
8 baris baru untuk menggantikannyaInformasi lebih lanjut tentang penggunaan REPLACE
dapat ditemukan di dokumentasi resmi
Menggunakan INSERT .. ON DUPLICATE KEY UPDATE
Metode alternatif [dan umumnya disukai] untuk
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;
1 ke dalam baris yang mungkin berisi duplikat 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'
5 atau 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'
6 nilai adalah dengan menggunakan pernyataan dan klausa INSERT .. ON DUPLICATE KEY UPDATE
Tidak seperti REPLACE
– perintah yang secara inheren merusak karena perintah
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]
3 yang dilakukannya bila perlu – menggunakan INSERT .. ON DUPLICATE KEY UPDATE
tidak merusak, karena hanya akan mengeluarkan pernyataan INSERT
atau 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;
9, tetapi tidak pernah 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]
3Misalnya, kami telah memutuskan ingin mengganti rekaman
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]
6 Telur Hijau dan Ham kami dan mengembalikannya ke rekaman In Search of Lost Time asli sebagai gantinya. Oleh karena itu, kami dapat mengambil pernyataan INSERT
_ asli kami dan menambahkan klausa 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]
_3 barumysql> 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 kita menggunakan sintaks
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;
9 normal [namun mengecualikan nama 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]
5 yang tidak perlu dan kata kunci 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]
6], dan hanya menetapkan nilai 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]
7. Selain itu, meskipun metode 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]
_3 tidak perlu berfungsi dengan baik, kami juga memilih untuk menggunakan 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]
9 sehingga kami tidak perlu menentukan nilai sebenarnya yang ingin kami INSERT
atau 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;
9 lebih dari sekali