2009-08-02 12 views

risposta

184

Sì, INSERT ... ON DUPLICATE KEY UPDATE. Ad esempio:

INSERT INTO `usage` 
(`thing_id`, `times_used`, `first_time_used`) 
VALUES 
(4815162342, 1, NOW()) 
ON DUPLICATE KEY UPDATE 
`times_used` = `times_used` + 1 
+0

Wow, che è impressionante. Gli altri RDMS hanno questa caratteristica? –

+10

Sì, credo che l'equivalente di SQL Server si chiami 'MERGE'. In generale, il concetto è spesso definito come "UPSERT". – chaos

+0

Ma questo non funziona quando non è presente la prim.key. La mia tabella è simile alla seguente: geb | argomento | visitato Voglio inserire INSERISCI nella tabella SET visitato = NOW(), geb = 1, argomento = 1 Ma se c'è già una combinazione di geb = 1 && topic = 1 allora dovrebbe aggiornare la riga invece di inserire uno nuovo. – blub

2

So che questa è una domanda vecchia, ma Google mi ha condotto qui di recente, quindi immagino che anche altri vengano qui.

@chaos è corretto: non è la sintassi INSERT ... ON DUPLICATE KEY UPDATE.

Tuttavia, la domanda originale ha posto domande specifiche su MySQL e in MySQL c'è la sintassi REPLACE INTO .... IMHO, questo comando è più facile e più intuitivo da utilizzare per gli upster. Dal manuale:

REPLACE funziona esattamente come INSERT, tranne che se una vecchia riga della tabella ha lo stesso valore di una nuova riga per una chiave primaria o un indice univoco, la riga vecchia viene eliminata prima della nuova riga è inserita.

Nota questo non è standard SQL. Un esempio da manuale:

CREATE TABLE test (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    data VARCHAR(64) DEFAULT NULL, 
    ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (id) 
); 

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00'); 
Query OK, 1 row affected (0.04 sec) 

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42'); 
Query OK, 2 rows affected (0.04 sec) 

mysql> SELECT * FROM test; 
+----+------+---------------------+ 
| id | data | ts     | 
+----+------+---------------------+ 
| 1 | New | 2014-08-20 18:47:42 | 
+----+------+---------------------+ 
1 row in set (0.00 sec) 

Edit: Solo un avvertimento giusto che REPLACE INTO non è come UPDATE. Come dice il manuale, REPLACE elimina la riga se esiste, quindi ne inserisce una nuova. (Notare i divertenti "2 righe interessate" nell'esempio precedente.) Cioè, sostituirà i valori di tutti colonne di un record esistente (e non semplicemente aggiornare alcuni colonne.) Il comportamento di MySQL REPLACE INTO è molto come quello di Sqlite INSERT OR REPLACE INTO. Vedere this question per alcune soluzioni alternative se si desidera aggiornare solo alcune colonne (e non tutte le colonne) se il record esiste già.

Problemi correlati