Antworten:
Verwenden Sie INSERT ... ON DUPLICATE KEY UPDATE
. Beispielsweise:
INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1
geb
und topic
dieser funktioniert ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).
MERGE
aber ich bin nicht sicher, ob seine Syntax mit der von SQL Server identisch ist.
NULL
, damit das auto_increment
Verhalten funktioniert (was ansonsten ja so funktioniert, wie Sie es annehmen ; siehe dev.mysql.com/doc/refman/5.5/en/example-auto-increment). html ).
VALUES(col)
, um den Wert aus dem Einfüge-Argument im Falle eines Duplikats zu erhalten. ZB:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Ich weiß, dass dies eine alte Frage ist, aber Google hat mich kürzlich hierher geführt, sodass ich mir vorstellen kann, dass auch andere hierher kommen.
@chaos ist richtig: Es gibt die INSERT ... ON DUPLICATE KEY UPDATE
Syntax.
Die ursprüngliche Frage wurde jedoch speziell zu MySQL gestellt, und in MySQL gibt es die REPLACE INTO ...
Syntax. IMHO ist dieser Befehl einfacher und unkomplizierter für Upserts zu verwenden. Aus dem Handbuch:
REPLACE funktioniert genau wie INSERT, außer dass, wenn eine alte Zeile in der Tabelle denselben Wert wie eine neue Zeile für einen PRIMARY KEY oder einen UNIQUE-Index hat, die alte Zeile gelöscht wird, bevor die neue Zeile eingefügt wird.
Beachten Sie, dass dies kein Standard-SQL ist. Ein Beispiel aus dem Handbuch:
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: Nur eine faire Warnung, REPLACE INTO
die nicht so ist UPDATE
. Wie im Handbuch angegeben, wird REPLACE
die vorhandene Zeile gelöscht und eine neue eingefügt. (Beachten Sie die lustigen "2 betroffenen Zeilen" im obigen Beispiel.) Das heißt, es ersetzt die Werte aller Spalten eines vorhandenen Datensatzes (und aktualisiert nicht nur einige Spalten.) Das Verhalten von MySQL REPLACE INTO
ist dem von Sqlite sehr ähnlich INSERT OR REPLACE INTO
. In dieser Frage finden Sie einige Problemumgehungen, wenn Sie nur einige Spalten (und nicht alle Spalten) aktualisieren möchten, wenn der Datensatz bereits vorhanden ist.
MERGE
. Im Allgemeinen wird das Konzept oft als bezeichnet"UPSERT"
.