Чи є простий шлях до INSERT
рядка, коли він не існує, або UPDATE
якщо він існує, використовуючи один запит MySQL?
Чи є простий шлях до INSERT
рядка, коли він не існує, або UPDATE
якщо він існує, використовуючи один запит MySQL?
Відповіді:
Використовуйте INSERT ... ON DUPLICATE KEY UPDATE
. Наприклад:
INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1
geb
і topic
він буде працювати ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).
MERGE
але я не впевнений, чи його синтаксис ідентичний синтаксису SQL Server.
NULL
, щоб дозволити auto_increment
поведінці працювати (що в іншому випадку, так, працює, як ви припускаєте; див. Dev.mysql.com/doc/refman/5.5/uk/example-auto-increment). html ).
VALUES(col)
для отримання значення з аргументу insert у разі дублювання. Напр .:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Я знаю, що це давнє запитання, але Google останнім часом мене привів сюди, тому я думаю, що сюди також приходять інші.
@chaos правильний: є INSERT ... ON DUPLICATE KEY UPDATE
синтаксис.
Однак оригінальне питання, яке задають саме про MySQL, а в MySQL є REPLACE INTO ...
синтаксис. ІМХО, цю команду легше і простіше використовувати для поновлення. З посібника:
REPLACE працює точно так само, як INSERT, за винятком випадків, коли старий рядок у таблиці має те саме значення, що й новий рядок для PRIMARY KEY або UNIQUE index, старий рядок видаляється перед тим, як вставити новий рядок.
Зауважте, це не стандартний SQL. Приклад з посібника:
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)
Правка: Просто чесне попередження, яке REPLACE INTO
не подобається UPDATE
. Як зазначено в посібнику, REPLACE
рядок видаляється, якщо він існує, а потім вставляє новий. (Зверніть увагу на смішні "2 рядки, які вплинули" у наведеному вище прикладі.) Тобто він замінить значення всіх стовпців існуючого запису (а не просто оновить деякі стовпці.) Поведінка MySQL REPLACE INTO
дуже схожа на поведінку Sqlite INSERT OR REPLACE INTO
. Перегляньте це питання для деяких обхідних шляхів, якщо ви хочете оновити лише кілька стовпців (а не всіх стовпців), якщо запис уже існує.
MERGE
. Загалом, поняття часто називають"UPSERT"
.