Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara INSERT Jika Baris Tidak Ada (UPSERT) di MySQL

  • 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, lalu INSERT 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengukur waktu kueri MySQL yang sebenarnya

  2. Cara Menghubungkan Ke Server MySQL Setelah Menginstal XAMPP Di Mac OS

  3. Urutan MySQL berdasarkan kecocokan terbaik

  4. Pilih 10 Catatan Teratas untuk Setiap Kategori di MySQL

  5. Bagaimana cara mengekspor database SQL Server ke MySQL?