MySQL ON DUPLICATE KEY UPDATE per l'inserimento di più righe in una singola query


200

Ho una query SQL in cui desidero inserire più righe in una singola query. quindi ho usato qualcosa del tipo:

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

mysql_query( $sql, $conn );

Il problema è quando eseguo questa query, voglio verificare se una UNIQUEchiave (che non è la PRIMARY KEY), ad esempio 'name'sopra, dovrebbe essere controllata e se tale 'name'esiste già, l'intera riga corrispondente dovrebbe essere aggiornata altrimenti inserita.

Ad esempio, nell'esempio seguente, se 'Katrina'è già presente nel database, l'intera riga, indipendentemente dal numero di campi, deve essere aggiornata. Ancora una volta, se 'Samia'non è presente, la riga deve essere inserita.

Ho pensato di usare:

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

Ecco la trappola. Mi sono bloccato e confuso su come procedere. Ho più righe da inserire / aggiornare alla volta. Per favore, dammi una direzione. Grazie.

Risposte:


480

Utilizzare la parola chiave VALUESper fare riferimento a nuovi valori (consultare la documentazione ).

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
Cosa succede se è necessario includere un'istruzione IF nell'aggiornamento che presenta una condizione diversa per ogni riga?
logica,

2
@logic: ci sono diverse domande a riguardo: Ricerca StackOverflow . Se nessuno di loro risponde alla tua domanda, ti preghiamo di pubblicarne uno nuovo che spieghi esattamente di cosa hai bisogno.
Peter Lang,

@logic hai trovato una soluzione per il tuo problema? attualmente sto affrontando lo stesso problema
Parth Kharecha,

Ottimo consiglio Se vuoi incrementare un valore quando duplicato, aggiungi questo dopo la parte "ON DUPLICATE KEY UPDATE": total = total + VALUES (total)
phoenix

1

INSERT INTO ... ON DUPLICATE KEY UPDATE funzionerà solo per MYSQL, non per SQL Server.

per SQL Server, il modo per aggirare questo problema è innanzitutto dichiarare una tabella temporanea, inserire un valore in quella tabella temporanea e quindi utilizzare MERGE

Come questo:

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
Chi utilizza SQL Server però: D
Jeremy Belolo,

-3

È possibile utilizzare Sostituisci anziché INSERT ... ON DUPLICATE KEY UPDATE.


28
Sì, ma usando REPLACE la vecchia riga viene eliminata prima di inserire la nuova riga. Voglio conservare la vecchia riga per mantenere gli ID primari.
Prashant,

2
Non mi ero reso conto che conservare il vecchio PK è in qualche modo importante per te ... Sicuramente, REPLACE non funzionerà in questo caso ...
a1ex07

4
PS: "Sostituisci in" richiede sia i privilegi di cancellazione che quelli di inserimento!
Oliver M Grech,

2
e per i motivi di cancellazione / inserimento sopra menzionati, è anche molto più lento in questi casi.
Ross,

1
Cosa succede se si desidera aggiornare alcune colonne? Sostituisci aggiornerà tutto.
imVJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.