MySQL ON DUPLICATE KEY UPDATE untuk memasukkan beberapa baris dalam permintaan tunggal


199

Saya memiliki query SQL di mana saya ingin memasukkan beberapa baris dalam permintaan tunggal. jadi saya menggunakan sesuatu seperti:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

Masalahnya adalah ketika saya menjalankan query ini, saya ingin memeriksa apakah UNIQUEkunci (yang bukan PRIMARY KEY), misalnya di 'name'atas, harus diperiksa dan jika 'name'sudah ada, seluruh baris yang sesuai harus diperbarui atau dimasukkan.

Misalnya, dalam contoh di bawah ini, jika 'Katrina'sudah ada dalam database, seluruh baris, terlepas dari jumlah bidang, harus diperbarui. Sekali lagi jika 'Samia'tidak ada, baris harus dimasukkan.

Saya berpikir untuk menggunakan:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

Inilah jebakannya. Saya buntu dan bingung bagaimana untuk melanjutkan. Saya memiliki beberapa baris untuk disisipkan / diperbarui pada suatu waktu. Tolong beri saya arahan. Terima kasih.

Jawaban:


479

Gunakan kata kunci VALUESuntuk merujuk ke nilai baru (lihat dokumentasi ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
Bagaimana jika kita perlu memasukkan pernyataan IF dalam UPDATE yang memiliki kondisi berbeda untuk setiap baris?
logic

2
@logika: Ada beberapa pertanyaan terkait ini: Pencarian StackOverflow . Jika tidak ada yang menjawab pertanyaan Anda, silakan posting yang baru menjelaskan apa yang Anda butuhkan.
Peter Lang

@logic Anda menemukan solusi untuk masalah Anda? Saat ini saya menghadapi masalah yang sama
Parth kharecha

Saran bagus. Jika Anda ingin menambah nilai saat duplikat, tambahkan ini setelah bagian "ON DUPLICATE KEY UPDATE": total = total + VALUES (total)
phoenix

1

INSERT INTO ... ON DUPLICATE KEY UPDATE hanya akan berfungsi untuk MYSQL, bukan untuk SQL Server.

untuk SQL server, cara untuk mengatasi ini adalah dengan pertama-tama mendeklarasikan tabel temp, masukkan nilai ke tabel temp, dan kemudian gunakan MERGE

Seperti ini:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
Yang menggunakan SQL server: D
Jeremy Belolo

-3

Anda dapat menggunakan Ganti alih-alih INSERT ... ON DUPLICATE KEY UPDATE.


28
Ya tetapi menggunakan REPLACE, baris lama dihapus sebelum baris baru dimasukkan. Saya ingin mempertahankan baris lama untuk mempertahankan id utama.
Prashant

2
Saya tidak menyadari bahwa mempertahankan PK lama itu penting bagi Anda ... Tentunya, REPLACE tidak akan berfungsi dalam kasus ini ...
a1ex07

4
PS: "ganti menjadi" membutuhkan hak untuk menghapus dan memasukkan!
Oliver M Grech

2
dan untuk alasan hapus / masukkan yang disebutkan di atas, ini juga jauh lebih lambat dalam hal ini.
Ross

1
Bagaimana jika Anda ingin memperbarui beberapa kolom? Ganti akan memperbarui semua.
imVJ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.