MySQL DUPLICATE ANAHTAR GÜNCELLEMEDE, tek bir sorguya birden çok satır ekleme


202

Tek bir sorguda birden çok satır eklemek istediğiniz bir SQL sorgusu var. bu yüzden şöyle bir şey kullandım:

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

mysql_query( $sql, $conn );

Sorun bu sorguyu yürüttüğümde, bir UNIQUEanahtar (ki değil PRIMARY KEY), örneğin 'name'yukarıda, kontrol edilmesi ve böyle bir 'name'zaten varsa, karşılık gelen tüm satır aksi takdirde güncelleştirilmesi gerektiğini kontrol etmek istiyorum.

Örneğin, aşağıdaki örnekte 'Katrina', veritabanında zaten varsa , alan sayısına bakılmaksızın tüm satır güncellenmelidir. Yine yoksa 'Samia', satır eklenmelidir.

Kullanmayı düşündüm:

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

İşte tuzak. Nasıl ilerleyeceğim konusunda takıldım ve kafam karıştı. Bir seferde eklemek / güncellemek için birden fazla satırım var. Lütfen bana bir yön ver. Teşekkürler.

Yanıtlar:


481

VALUESYeni değerlere başvurmak için anahtar kelime kullanın ( belgelere bakın ).

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
UPDATE'e her satır için farklı bir koşula sahip bir IF deyimi eklememiz gerekirse ne olur?
mantık

2
@logic: Bununla ilgili birkaç soru var: StackOverflow araması . Hiçbiri sorunuzu cevaplamıyorsa, lütfen tam olarak neye ihtiyacınız olduğunu açıklayan yeni bir soru gönderin.
Peter Lang

@logic sorununuz için herhangi bir çözüm buldunuz mu? şu anda aynı sorunla karşı karşıyayım
Parth kharecha

Büyük öneri. Çoğaltırken bir değeri artırmak istiyorsanız, bunu "ÇİFT YÖNLÜ ANAHTAR GÜNCELLEME" bölümünden sonra ekleyin: total = total + VALUES (total)
phoenix

2

INUP ... IN DUPLICATE KEY UPDATE, SQL Server için değil, yalnızca MYSQL için çalışır.

SQL Server için, bu geçici çözüm, öncelikle geçici tablo bildirmek, bu geçici tabloya değer eklemek ve daha sonra MERGE kullanmaktır

Bunun gibi:

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
SQL Server'ı kim kullanıyor: D
Jeremy Belolo

-3

INSERT ... yerine DUPLICATE KEY UPDATE yerine Replace kullanabilirsiniz .


28
Evet, ancak REPLACE öğesini kullanarak yeni satır eklenmeden önce eski satır silinir. Birincil kimlikleri korumak için eski satırı korumak istiyorum.
Prashant


4
Not: "Değiştir", hem silme hem de ekleme ayrıcalıkları gerektirir!
Oliver M Grech

2
ve yukarıda belirtilen silme / ekleme nedenleriyle, bu durumlarda da çok daha yavaştır.
Ross

1
Birkaç sütunu güncellemek isterseniz ne olur? Değiştir her şeyi güncelleyecektir.
imVJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.