MySQL插入更新_ON DUPLICATE KEY UPDATE

时间:2023-03-08 18:03:44

前提:操作的表具有主键或唯一索引

INSERT INTO:表中不存在对应的记录,则插入;若存在对应的记录,则报错;

INSERT INTO IGNORE:表中不存在对应的记录,则插入;若存在对应的记录,则忽略,不进行任何操作

REPLACE INTO:表中不存在对应的记录,则插入;若存在对应的记录,则删除原有的记录,再 插入新的记录。

ON DUPLICATE KEY UPDATE(on duplicate key update)的功能类似于REPLACE INTO:

若表中不存在数据(没有待插入记录的主键值或唯一索引值),则直接插入新的记录;

若表中已存在数据(主键或唯一索引值相同),则执行更新操作。

所以,ON DUPLICATE KEY UPDATE与REPLACE INTO在操作过程上不同的是:

当已存在数据时,ON DUPLICATE KEY UPDATE执行更新操作,而不是先删除原有记录,再插入新记录。

语句:INSERT INTO table_name (field1,field2...) values (value1,value2...) on duplicate key update filed3=value3;

说明:update后面接的语句可以是其它表达式。

假设有一个以下table:

mysql> select * from staff_3;
+----+----------+-------+
| ID | name | slary |
+----+----------+-------+
| | liding | |
| | haofugui | |
| | xiaoli | |
| | xiaohua | |
+----+----------+-------+
rows in set (0.00 sec) mysql> describe staff_3;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| ID | int() | NO | PRI | NULL | auto_increment |
| name | char() | YES | UNI | NULL | |
| slary | int() | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
rows in set (0.00 sec)

进行on duplicate key on命令:(从ID可以看出,该命令执行更新操作别浪费自增属性值)

mysql> insert into staff_3 (name,slary) values ('xiaoli',) on duplicate key update slary=;
Query OK, rows affected (0.00 sec) mysql> select * from staff_3;
+----+----------+-------+
| ID | name | slary |
+----+----------+-------+
| | liding | |
| | haofugui | |
| | xiaoli | |
| | xiaohua | |
+----+----------+-------+
rows in set (0.00 sec) mysql> insert into staff_3 (name,slary) values ('xiaoming',) on duplicate key update slary=;
Query OK, row affected (0.00 sec) mysql> select * from staff_3;
+----+----------+-------+
| ID | name | slary |
+----+----------+-------+
| | liding | |
| | haofugui | |
| | xiaoli | |
| | xiaohua | |
| | xiaoming | |
+----+----------+-------+
rows in set (0.00 sec)