SQL: ON DUPLICATE KEY 比 REPLACE 好用多了,优势和注意点也多!
REPLACE
实际操作是:
根据索引判断都否存在唯一数据,没有就新增;
如果有索引数据,就先删除,在新增。
随着数据不断增多,频繁删除索引数据,操作速度会越来越慢。
应用场景:
针对一行或多行数据,进行数据新增 或 替换。(都是全新的数据,可以理解为 “格式化安装” )
如果担心数据被污染,需要以目前数据为基准,可以使用 replace 操作
ON DUPLICATE KEY
实际操作是:
根据索引判断都否存在唯一数据,没有就新增;
如果有索引数据,更新update 后面的数据。
并没有频繁操作索引。
应用场景:
针对一行或多行数据,进行数据新增 或 指定字段更新更新操作。(新增就是全新数据,更新就是指定的字段替换为新数据,可以理解为 “新增数据,并且打补丁” )
如果希望修改部分字段数据,也可以更新全字段数据。但不修改索引的操作。可以使用 INSERT INTO ON DUPLICATE KEY UPDATE 操作。
更多优点:
单个操作:
例如:
INSERT INTO air_ticket_ow_meituan (`aaa`, `bbb`, `ccc`)
VALUES (111,222,333)
ON DUPLICATE KEY
UPDATE `bbb`=888, `xxx`=999, `zzz`='kkkkkk'
可以实现新增内容 或 更新内容 不同字段 不同内容。可以更新 更多的数据状态!
多个:
例如 1:
INSERT INTO air_ticket_ow_meituan (`aaa`, `bbb`, `ccc`)
VALUES (111,222,333) ,
(444,555,666)
ON DUPLICATE KEY
UPDATE `bbb`=888, `xxx`=999, `zzz`='kkkkkk'
可以实现 多条 新增内容 或 更新内容 不同字段 不同内容。可以更新 更多的数据状态!
但是这种更新方式,字段是固定的值。
例如 2:
INSERT INTO air_ticket_ow_meituan (`aaa`, `bbb`, `ccc`)
VALUES (111,222,333) ,
(444,555,666)
ON DUPLICATE KEY
UPDATE `bbb`=VALUES(bbb), `ccc`=VALUES(ccc), `state`=1 , `updateTime`=NOW()
可以实现 多条 新增内容 或 更新内容 不同字段 不同内容。可以更新 更多的数据状态!
这种模式更新,可以实现 指定的部分字段动态更新,指定的其他字段固定更新。非常神奇!
注意事项:
这样做虽然方便。但是同样的 SQL 执行第二遍,会带来不同的结果!
因为二次执行针对 前一次的新增数据是更新操作!
所以一定要选择好应用场景!