2011-01-04 15 views
153

Ho una tabella con una chiave unica per due colonne:INSERT ... ON KEY duplicati (non fare nulla)

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 nella tabella che, ma se la chiave esiste, a fare niente! Non voglio che venga generato un errore perché esistono le chiavi.

So che c'è la seguente sintassi:

INSERT ... ON DUPLICATE KEY UPDATE ... 

ma c'è qualcosa di simile:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

risposta

256

Sì, c'è INSERT IGNORE oppure è possibile effettuare ON DUPLICATE KEY UPDATE id=id.

+3

solo per aggiungere IGNORA dopo l'INSERIMENTO, il resto della sintassi è lo stesso? – ufk

+19

@ufk: 'INSERIRE IGNORA' senza la parte' ON DUPLICATE KEY', ad es. 'INSERIRE IGNORA INTO xpo.user_permanent_gift (...) VALUES (...)' – BoltClock

+95

Nota che INSERT IGNORE ignora anche altri errori come errori di conversione dei dati. – mjcopple

0

Per quanto ne so, non lo è.

L'UPDATE IGNORE ignora anche eventuali altri errori che penso sia molto rischioso.

Quello che (non può essere la cosa migliore da fare) è implementare la sintassi UPDATE con una dichiarazione "innocuo" UPDATE in questo modo:

INSERT INTO mytable (id, ...) VALUES (4, ...) ON DUPLICATE KEY UPDATE id=4; 

Ovviamente, questo ha scrivere inutili I/O, ma per me questo ha funzionato bene finora.

Problemi correlati