Domanda

Esiste un modo semplice per INSERIRE una riga quando non esiste, oppure per AGGIORNARE se esiste, usando una query MySQL?

È stato utile?

Soluzione

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

Altri suggerimenti

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

@chaos è corretto: c'è < code> INSERT ... ON DUPLICATE KEY UPDATE sintassi

Tuttavia, la domanda originale posta su MySQL in particolare, e in MySQL c'è SOSTITUISCI IN ... sintassi. IMHO, questo comando è più semplice e diretto da utilizzare per gli upsert. Dal manuale:

  

REPLACE funziona esattamente come INSERT, tranne per il fatto che se una vecchia riga della tabella ha lo stesso valore di una nuova riga per un PRIMARY KEY o un indice UNIQUE, la vecchia riga viene eliminata prima dell'inserimento della nuova riga.

Nota che questo non è SQL standard. Un esempio dal 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)

Modifica: Un semplice avvertimento che SOSTITUISCI non è come AGGIORNAMENTO . Come dice il manuale, REPLACE cancella la riga se esiste, quindi ne inserisce una nuova. (Nota le divertenti "2 righe interessate" nell'esempio sopra.) Cioè sostituirà i valori di tutte le colonne di un record esistente (e non semplicemente aggiornerà alcune colonne.) Il comportamento di REPLACE INTO di MySQL è molto simile a quello di INSERT OR REPLACE INTO di Sqlite. Vedi questa domanda per alcune soluzioni alternative se desideri aggiornare solo alcune colonne ( e non tutte le colonne) se il record esiste già.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top