C'è un modo semplice per INSERT
una riga quando non esiste, o per UPDATE
se esiste, utilizzando uno query MySQL?Come aggiornare se esiste, inserire se non (AKA "upsert" o "unire") in MySQL?
risposta
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
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à.
- 1. MySQL - inserire, se non esiste ancora
- 2. Qualsiasi modo per SQLBulkCopy "inserire o aggiornare se esiste"?
- 3. MySQL modo "buono" per inserire una riga, se non trovato, o aggiornare, se si trova
- 4. MongoDB: inserire record se non esiste, ignora se lo fa
- 5. Inserire nella tabella h2 se non esiste
- 6. Domanda ANSI SQL: come inserire o aggiornare un record se esiste già?
- 7. Oracle SQL: aggiornamento se esiste altro inserire
- 8. Inserire se non esiste, altrimenti id ritorno in PostgreSQL
- 9. Oracle inserire se non esiste dichiarazione
- 10. MongoDB atomico "findOrCreate": findOne, inserire se inesistente, ma non aggiornare
- 11. Se esiste o esiste?
- 12. Aggiornare una riga se esiste, se non crearne una nuova MySQL
- 13. MySQL: Aggiungi vincolo se non esiste
- 14. mysql ALTER TABLE se colonna non esiste
- 15. tabelle Unire se il riferimento esiste
- 16. Upsert in Mongoide
- 17. MySQL Seleziona un'altra riga se non esiste
- 18. mysql crea utente se non esiste
- 19. come dire creare la procedura se non esiste in MySQL
- 20. MySQL: Inserisci se esiste una chiave esterna
- 21. grilletto Goccia se esiste in MySQL
- 22. mysql, se non nullo, 0 o ""
- 23. determinare se mysql o percona o mariaDB
- 24. Se una riga non esiste inserire altro non inserire in postgres
- 25. elasticsearch Aggiorna API se un campo non esiste
- 26. Inserire controllo query se esiste registrazione - In caso contrario, inserirla
- 27. MySQL: Come aggiungere una colonna se non esiste già?
- 28. Come fare se non esiste in SQLite
- 29. SQLite Query per inserire un record Se non esiste
- 30. SE NON ESISTE nell'istruzione Merge?
Wow, che è impressionante. Gli altri RDMS hanno questa caratteristica? –
Sì, credo che l'equivalente di SQL Server si chiami 'MERGE'. In generale, il concetto è spesso definito come "UPSERT". – chaos
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