2010-04-26 15 views
144

Ho una query sql in cui voglio inserire più righe in una singola query. così ho usato qualcosa come:MySQL ON DUPLICATE KEY UPDATE per più righe inserite in una singola query

$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 chiave unica (che non è la chiave primaria), per esempio. 'nome' nel caso precedente, deve essere controllato e se tale 'nome' esiste già, l'intera riga corrispondente deve essere aggiornata altrimenti inserita.

Ad esempio, in seguito ad esempio, se "Katrina" è già presente nel database, l'intera riga, indipendentemente dal numero di campi, deve essere aggiornata. Anche in questo caso se 'Samia' non è presente, la riga deve essere inserita.

Ho pensato di utilizzare:

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 ho confuso come procedere. Ho più righe da inserire/aggiornare alla volta. Per favore dammi la direzione. Grazie.

risposta

338

Utilizzare la parola chiave VALUES per fare riferimento a nuovi valori (vedere documentation).

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

Grazie mille. Questo è esattamente quello che voglio .... Grazie ancora ... – Prashant

+10

** bellissimo **, esattamente quello di cui avevo bisogno. * heh, guarda cosa ho fatto lì? * –

+0

Cosa fare se è necessario includere un'istruzione IF nell'aggiornamento che presenta una condizione diversa per ogni riga? – logic

-1

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

+16

Sì, ma utilizzando SOSTITUIRE la vecchia riga viene eliminata prima che la nuova riga sia inserita. Voglio conservare la vecchia riga per mantenere gli ID principali. – Prashant

+2

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

+0

Se non ti importa di PK comunque, come nel mio caso, questo funziona perfettamente. – MLeFevre

Problemi correlati