MERGE INTO 是 Oracle 和 DB2的语法, 而 Mysql的用法是 ON DUPLICATE KEY UPDATE

INSERT INTO
  表名 (列名1,列名2,列名3,......)
VALUES
  (列名1数据,列名2数据,列名3数据,......)
-- 如果上面插入的数据已经存在,就执行更新
ON DUPLICATE KEY UPDATE
  列名1 = 列名1数据, 列名2 = 列名2数据, 列名3 = 列名3数据,......

这个语法的目的是为了解决数据的重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它

规则是这样的:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。

示例
INSERT INTO
  sys_user (user_id, user_nickname)
VALUES
  ('TYUFGHJK345678', 'eric.mao')
ON DUPLICATE KEY UPDATE
  user_nickname = 'eric.mao12';

执行上面这条语句的结果如下:
第一次执行: 会插入一条选项的数据 因为没有重复的数据,它执行了插入语句,并没有执行更新语句

mysql> SELECT user_id, user_nickname FROM sys_user;
+-----------------+---------------+
| user_id         | user_nickname |
+-----------------+---------------+
| TYUFGHJK345678  | eric.mao      |
+-----------------+---------------+

第二次执行: 会出现主键冲突,所以它才会执行下面的 UPDATE语句,对数据进行了更新

mysql> SELECT user_id, user_nickname FROM sys_user;
+-----------------+---------------+
| user_id         | user_nickname |
+-----------------+---------------+
| TYUFGHJK345678  | eric.mao12    |
+-----------------+---------------+

第三次执行: 这次我们什么都没有修改,因此它不会做任何的操作,数据保持不变

mysql> SELECT user_id, user_nickname FROM sys_user;
+-----------------+---------------+
| user_id         | user_nickname |
+-----------------+---------------+
| TYUFGHJK345678  | eric.mao12    |
+-----------------+---------------+
分类: MySQL

发表评论

电子邮件地址不会被公开。 必填项已用*标注