2010-03-02 19 views
118

Ragazzi Sto cercando di completare questa query -> il mio campo tag è impostato su UNIQUE e voglio semplicemente che il database ignori qualsiasi tag duplicato.Il tasto duplicato ignora?

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') 
ON DUPLICATE KEY IGNORE '*the offending tag and carry on*' 

o anche questo sarebbe accettabile

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') 
ON DUPLICATE KEY UPDATE '*the offending tag and carry on*' 
+0

Vedi anche : ["INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"] (http://stackoverflow.com/q/548541/1402846). – Pang

risposta

270

suggerisco di non utilizzare INSERISCI IGNORA come ignora TUTTI gli errori (cioè è un ignorare globale trascurato). Invece, dal momento che nel tuo esempio tag è la chiave univoca, uso:

INSERT INTO table_tags (tag) VALUES ('tag_a'),('tab_b'),('tag_c') ON DUPLICATE KEY UPDATE tag=tag; 

sulla chiave duplicata produce:

Query OK, 0 righe interessate (0.07 sec)

+3

Esattamente, buona risposta. INSERIMENTO IGNORA è una cattiva notizia! – Boundless

+1

@Derrick prenderebbe in considerazione la possibilità di cambiare la risposta accettata a questo per i futuri utenti? Sarebbe meglio avere la soluzione più sicura come quella accettata per coloro che fanno riferimento a questa stessa domanda. – damianb

+1

@Boundless Dipende davvero, ad esempio, ho una tabella che contiene categorie per una particolare voce di dati nel database. Sulle modifiche a queste categorie vorrei utilizzare un INSERIMENTO IGNORE contenente tutte queste categorie piuttosto che test per vedere le differenze tra queste categorie. – Jay

11

MySQL ha questo pratico comando UPDATE INTO;)

modificare Sembra che hanno cambiato titolo per sostituire

SOSTITUIRE opere esattamente come INSERT, eccetto th a se un vecchio riga nella tabella ha lo stesso valore di una nuova riga per una PRIMARY KEY o un indice univoco, il vecchio fila viene eliminato prima la nuova riga è inserito

+0

Dood, avrò bisogno che tu sviluppi su quello? –

+0

Grazie per l'aiuto e il tempo, la soluzione di Ivan Nevostruev sembra fare il trucco per me –

+44

Sostituisci eliminerà le righe in conflitto prima di sostituirle. Se hai chiavi esterne, puntando alle righe cancellate sei nei guai. – nakhli