INSERISCI… SUL TASTO DUPLICATO (non fare nulla)


184

Ho una tabella con una chiave univoca per due colonne:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Voglio inserire una riga in quella tabella, ma se esiste la chiave, per non fare nulla! Non voglio che venga generato un errore perché esistono le chiavi.

So che esiste la sintassi seguente:

INSERT ... ON DUPLICATE KEY UPDATE ...

ma c'è qualcosa come:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Risposte:


332

Sì, usa INSERT ... ON DUPLICATE KEY UPDATE id=id(non attiverà l'aggiornamento di riga anche se idè assegnato a se stesso).

Se non ti interessano gli errori (errori di conversione, errori di chiave esterna) e l'esaurimento del campo di incremento automatico (viene incrementato anche se la riga non viene inserita a causa della chiave duplicata), utilizzare INSERT IGNORE.


5
solo per aggiungere IGNORE dopo INSERT, il resto della sintassi è lo stesso?
Uk,

25
@ufk: INSERT IGNOREsenza la ON DUPLICATE KEYparte, ad es.INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
Si noti che INSERT IGNORE ignora anche altri errori come errori di conversione dei dati.
mjcopple,

36
quindi userò ON DUPLICATE KEY UPDATE id = id. Voglio solo ignorare i duplicati chiave e nessun altro tipo di errore.
UFK

7
attenzione INSERISCI IGNORA aumenterà la colonna di incremento automatico anche se la riga non è inserita
WorM

9

COME ATTUARE "inserire se non esiste"?

1. REPLACE INTO

professionisti:

  1. semplice.

contro:

  1. troppo lento.

  2. il tasto di incremento automatico CAMBIA (aumenta di 1) se sono presenti corrispondenze di voci unique keyo primary key, poiché elimina la vecchia voce e inserisce una nuova.

2. INSERT IGNORE

professionisti:

  1. semplice.

contro:

  1. La chiave di incremento automatico non cambierà se ci sono corrispondenze di immissione unique keyo primary keyse l'indice di incremento automatico aumenterà di 1

  2. alcuni altri errori / avvisi verranno ignorati come errore di conversione dei dati.

3. INSERT ... ON DUPLICATE KEY UPDATE

professionisti:

  1. puoi facilmente implementare la funzione 'salva o aggiorna' con questo

contro:

  1. sembra relativamente complesso se si desidera inserire non aggiornare.

  2. La chiave di incremento automatico non cambierà se ci sono corrispondenze di immissione unique keyo primary keyse l'indice di incremento automatico aumenterà di 1

4. Un modo per arrestare l'aumento della chiave di incremento automatico in caso di corrispondenza delle voci unique keyo primary key?

Come menzionato nel commento seguente di @toien: "la colonna di auto-incremento verrà effettuata dipende dalla innodb_autoinc_lock_modeconfigurazione dopo la versione 5.1" se si utilizza innodbcome motore, ma ciò influisce anche sulla concorrenza, quindi deve essere ben considerato prima dell'uso . Finora non vedo alcuna soluzione migliore.


incremento automatico colonna sarà effettuato dipende dalla innodb_autoinc_lock_modeconfigurazione dopo la versione 5.1
toien

1

Usa ON DUPLICATE KEY UPDATE ...,
Negativo: perché UPDATEusa le risorse per la seconda azione.

Usa INSERT IGNORE ...,
negativo: MySQL non mostrerà alcun errore se qualcosa va storto, quindi non puoi gestirli. Usalo solo se non ti interessa la query.


@abdul c'è supporto mysql cosa hai spiegato qui?
Lalit Tarsariya,
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.