sql 更新字段(如果存在)或插入(如果不存在)(使用MySQL ON DUPLICATE KEY UPDATE)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 更新字段(如果存在)或插入(如果不存在)(使用MySQL ON DUPLICATE KEY UPDATE)相关的知识,希望对你有一定的参考价值。

mysql > CREATE TABLE `mytable` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `myvalue` int(11) NOT NULL,
        `myothervalue` int(11) NOT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `myvalue_unique` (`myvalue`), -- C'est le champ qui s'il existe alors on le met à jour,
        KEY `myvalue_idx` (`myvalue`)            -- sinon on crée un nouvel enregistrement
)
Query OK, 0 rows affected (0.09 sec) 

mysql> desc mytable;
+--------------+---------+------+-----+---------+----------------+
| Field        | Type    | Null | Key | Default | Extra          |
+--------------+---------+------+-----+---------+----------------+
| id           | int(11) | NO   | PRI | NULL    | auto_increment |
| myvalue      | int(11) | NO   | UNI | NULL    |                |
| myothervalue | int(11) | NO   |     | NULL    |                |
+--------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> INSERT INTO mytable (myvalue, myothervalue) VALUES (1, 1);
       INSERT INTO mytable (myvalue, myothervalue) VALUES (2, 2);
       INSERT INTO mytable (myvalue, myothervalue) VALUES (3, 3);
Query OK, 3 row affected (0.04 sec)

mysql> SELECT * FROM mytable;
+----+---------+--------------+
| id | myvalue | myothervalue |
+----+---------+--------------+
|  1 |       1 |            1 |
|  2 |       2 |            2 |
|  3 |       3 |            3 |
+----+---------+--------------+
3 rows in set (0.00 sec)

mysql> INSERT INTO mytable (myvalue,myothervalue) VALUES (1,1) ON DUPLICATE KEY UPDATE myothervalue=1;
Query OK, 0 rows affected (0.05 sec)

mysql> SELECT * FROM mytable;
+----+---------+--------------+
| id | myvalue | myothervalue |
+----+---------+--------------+
|  1 |       1 |            1 | -- Rien n'a changé
|  2 |       2 |            2 |
|  3 |       3 |            3 |
+----+---------+--------------+
3 rows in set (0.00 sec

mysql> INSERT INTO mytable (myvalue,myothervalue) VALUES (1,4) ON DUPLICATE KEY UPDATE myothervalue=4;
Query OK, 2 rows affected (0.05 sec)

mysql> SELECT * FROM mytable;
+----+---------+--------------+
| id | myvalue | myothervalue |
+----+---------+--------------+
|  1 |       1 |            4 | -- Magie !
|  2 |       2 |            2 |
|  3 |       3 |            3 |
+----+---------+--------------+
3 rows in set (0.00 sec)

mysql> INSERT INTO mytable (myvalue,myothervalue) VALUES (4,4) ON DUPLICATE KEY UPDATE myothervalue=4;
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM mytable;
+----+---------+--------------+
| id | myvalue | myothervalue |
+----+---------+--------------+
|  1 |       1 |            4 |
|  2 |       2 |            2 |
|  3 |       3 |            3 |
|  9 |       4 |            4 | -- Et voilà un nouvel enregistrement puisque `myvalue=4' n'existe pas
+----+---------+--------------+
4 rows in set (0.00 sec)

mysql> INSERT INTO mytable (myvalue,myothervalue) VALUES (1,1) ON DUPLICATE KEY UPDATE myothervalue=1;
Query OK, 2 rows affected (0.20 sec)

mysql> SELECT * FROM mytable;
+----+---------+--------------+
| id | myvalue | myothervalue |
+----+---------+--------------+
|  1 |       1 |            1 | -- Remettons le premier enregistrement à l'origine
|  2 |       2 |            2 |
|  3 |       3 |            3 |
|  9 |       4 |            4 |
+----+---------+--------------+
4 rows in set (0.00 sec)

-- Attention, tu vois la clé primaire `id' qui est passée à 9 ? C'est parce que même
-- si on ne fait qu'UPDATER une ligne la requête commence par `INSERT' qui incrémente 
-- le compteur automatiquement.

-- Note le découplage dans la requête où il faut indiquer deux fois la valeur du champ
-- à modifier (une fois si on UPDATE, une fois si on INSERT).

-- Plusieurs lignes peuvent être modifées ou ajoutées en une passe:
mysql> INSERT INTO mytable (myvalue,myothervalue)
       VALUES (5,5),(1,100) 
       ON DUPLICATE KEY 
       UPDATE myothervalue=VALUES(myothervalue);
Query OK, 3 rows affected (0.07 sec)
Records: 2  Duplicates: 1  Warnings: 0

mysql> SELECT * FROM mytable;
+----+---------+--------------+
| id | myvalue | myothervalue |
+----+---------+--------------+
|  1 |       1 |          100 |
|  2 |       2 |            2 |
|  3 |       3 |            3 |
|  9 |       4 |            4 |
| 15 |       5 |            5 |
+----+---------+--------------+
5 rows in set (0.00 sec)

以上是关于sql 更新字段(如果存在)或插入(如果不存在)(使用MySQL ON DUPLICATE KEY UPDATE)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?

MySql -- 不存在则插入,存在则更新或忽略

sql:mysql:MySql 不存在则插入,存在则更新或忽略

sql:mysql:MySql 不存在则插入,存在则更新或忽略

mysql批量更新,数据存在则更新,不存在则插入

Mysql插入数据:不存在则插入,存在则跳过或更新