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

Bagaimana saya bisa melakukan 'masukkan jika tidak ada' di MySQL?

Gunakan INSERT IGNORE INTO table .

Ada juga INSERT … ON DUPLICATE KEY UPDATE sintaks, dan Anda dapat menemukan penjelasannya di 13.2.6.2 INSERT ... PADA DUPLICATE KEY UPDATE Pernyataan .

Pos dari bogdan.org.ua menurut webcache Google :

18 Oktober 2007

Untuk memulai:pada MySQL terbaru, sintaks yang disajikan dalam judul tidak mungkin. Namun ada beberapa cara yang sangat mudah untuk mencapai apa yang diharapkan menggunakan fungsionalitas yang ada.

Ada 3 kemungkinan solusi:menggunakan INSERT IGNORE, REPLACE, orINSERT … ON DUPLICATE KEY UPDATE.

Bayangkan kita memiliki meja:

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Sekarang bayangkan bahwa kita memiliki pipeline otomatis yang mengimpor transkrip metadata dari Ensembl, dan karena berbagai alasan, pipeline mungkin rusak pada setiap langkah eksekusi. Jadi, kita perlu memastikan dua hal:

  1. eksekusi berulang dari pipeline tidak akan menghancurkan> database kami
  1. eksekusi berulang tidak akan mati karena kesalahan 'duplikat> kunci utama'.

Metode 1:menggunakan REPLACE

Ini sangat sederhana:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Jika catatan ada, itu akan ditimpa; jika belum ada, itu akan dibuat. Namun, menggunakan metode ini tidak efisien untuk kasus kami:kami tidak perlu menimpa catatan yang ada, tidak masalah untuk melewatinya.

Metode 2:menggunakan INSERT IGNORE Juga sangat sederhana:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Di sini, jika 'ensembl_transcript_id' sudah ada di database, itu akan dilewati secara diam-diam (diabaikan). (Lebih tepatnya, ini kutipan dari manual referensi MySQL:“Jika Anda menggunakan kata kunci IGNORE, kesalahan yang terjadi saat menjalankan pernyataan INSERT akan diperlakukan sebagai peringatan. Misalnya, tanpa IGNORE, baris yang menduplikasi indeks UNIQUE atau PRIMARY KEY yang ada. nilai dalam tabel menyebabkan kesalahan kunci duplikat dan pernyataan dibatalkan.”.) Jika record belum ada, record akan dibuat.

Metode kedua ini memiliki beberapa kelemahan potensial, termasuk non-aborsi kueri jika terjadi masalah lain (lihat manual). Oleh karena itu harus digunakan jika sebelumnya diuji tanpa kata kunci IGNORE.

Metode 3:menggunakan INSERT … PADA PEMBARUAN KUNCI DUPLICATE:

Opsi ketiga adalah menggunakan INSERT … ON DUPLICATE KEY UPDATE sintaks, dan di bagian UPDATE jangan lakukan apa-apa, lakukan beberapa operasi yang tidak berarti (kosong), seperti menghitung 0+0 (Geoffray menyarankan untuk melakukan tugas theid=id untuk mesin optimasi MySQL untuk mengabaikan operasi ini). Keuntungan dari metode ini adalah hanya mengabaikan kejadian kunci duplikat, dan masih membatalkan kesalahan lainnya.

Sebagai pemberitahuan terakhir:posting ini terinspirasi oleh Xaprb. Saya juga menyarankan untuk membaca postingannya yang lain tentang menulis kueri SQL yang fleksibel.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mySQL - Buat Tabel Baru Menggunakan Data dan Kolom dari Tiga Tabel

  2. Masukkan data dari satu tabel ke tabel lain di MySQL

  3. Menggunakan variabel dalam klausa LIMIT di MySQL

  4. JSON_OBJECTAGG() – Buat Objek JSON dari Hasil Kueri di MySQL

  5. MySQL DATEDIFF() vs TIMESTAMPDIFF():Apa Bedanya?