目录
- 1 PostgreSQL数据库
- 2 MySQL数据库
1 PostgreSQL数据库
代码语言:javascript复制insert into test (ID,name) values('1','2')
ON conflict("id","name")
DO UPDATE SET
(id, name) = (EXCLUDED.id, EXCLUDED.name)
代码语言:javascript复制 ON conflict("id","name") 就是根据这个里面设置的字段进行判断
数据是不是一样
2 MySQL数据库
代码语言:javascript复制ON DUPLICATE KEY UPDATE
案例
代码语言:javascript复制INSERT INTO `user_info`
(`user_id`,`door_id`,`email`,`address`,`create_time`,`update_time`)
VALUES (666,888,'test123@qq.com','北京市海淀区','2021-07-28 22:26:20.241','2021-07-28 22:26:20.241')
ON DUPLICATE KEY UPDATE `email`=VALUES(`email`),
`address`=VALUES(`address`),
`update_time`=VALUES(`update_time`)
代码语言:javascript复制使用这条语句的原因,是为了更好的执行插入和更新,
因为我们在插入一条语句时,表中可能已经存在了这条语句
,我们想实现更新的功能,或者表中没有这条语句,
我们想实现插入的功能,而这条语句直接可以同时解决
插入和更新的功能。
那么这条语句是如何解释呢,我们很容易理解前面的部分,
就是一个简单的插入语句,让我们看下后面的部分
ON DUPLICATE KEY UPDATE
`email`=VALUES(`email`),`address`=
VALUES(`address`),
`update_time`=VALUES(`update_time`)我们看到后面是
一个更新的操作,后面指定了更新的字段,
也就是说判断出表中没有这条数据,执行的前半部分,
插入指定字段得值,在判断出表中有数据,
则执行的的更新操作,更新后半部分指定的字段的值。
那么下一个问题出来了,我们是如何判断出这条数据是存在的,又需要更新哪些字段呢?
代码语言:javascript复制 规则如下:
如果你插入的记录导致UNIQUE索引重复,
那么就会认为该条记录存在,
则执行update语句而不是insert语句,
反之,则执行insert语句而不是更新语句。
比如我创建表的时候设置的唯一索引为字段(a,b,c),
那么当a,b,c三个字段完全重复时候,
此时就要执行更新语句。
当然满足一部分唯一索引是不会触发更新操作的,
此时会执行插入操作。
而至于要更新哪些字段,要看我们自己的需求了。
先声明一点:ON DUPLICATE KEY UPDATE 这个子句是MySQL特有的,语句的作用是,当insert已经存在的记录时,就执行update。
代码语言:javascript复制以上介绍的是addOrUpdate的语义,其实修改的方法有很多种,
包括SET或用REPLACE,连事务都省的做,
ON DUPLICATE KEY UPDATE能够让我们便捷的完成重复插入
的开发需求,但它是Mysql的特有语法,
使用时应多注意主键和插入值是否是我们想要插入
或修改的数据。
即便如此,在实际开发中,我们仍然不推荐这种写法,
因为这种写法耦合了add和update两种操作,
线上出现bug时,极难定位问题。推荐的做法是:
单写一个add方法,只负责插入数据,插入重复数据时,
根据业务场景做幂等性处理;单写一个update方法,
只负责更新操作。两个函数单独打自己的log,便于定位问题。