最近做一项目时,遇到一并发问题,需要将sql进行调整,当没有数据时更新 有数据时可根据条件更新,根据这个问题在网上搜索好久,最终经过各种坎坷终于搞出来了,记录下
INSERT INTO tbTest ( strEventType, lCustomerId, strTimeFlag, nCount )
VALUES
( 1, 1, 1, 1 )
ON DUPLICATE KEY UPDATE strEventType = 1,
lCustomerId = 1,
strTimeFlag = 1,
nCount =
IF
( nCount < 15, nCount + 1, nCount );
如上 当有数据时 根据条件更新 可以将条件通过 IF 判断加入
在网上还找到相关得一些规则及需要注意得地方,一并记录下
规则是这样的:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。所以 ON DUPLICATE KEY UPDATE是不能写where条件的。
这里需要特别注意的是:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2,如果更新的数据和已有的数据一模一样,则受影响的行数是0,这意味着不会去更新,也就是说即使你有的时间戳是自动记录最后一次的更新时间,这个时间戳也不会变动。
如果只需要进行判断是否存在该记录 不存在即插入数据得操作得话 我们可以使用如下语法:
INSERT INTO tbTest ( strEventType, lCustomerId, strTimeFlag, nCount ) SELECT
1,
1,
1,
1
FROM
DUAL
WHERE
NOT EXISTS ( SELECT strEventType, lCustomerId, strTimeFlag, nCount FROM tbTest WHERE strEventType = 1 AND lCustomerId = 1 AND strTimeFlag = 1 );
其中dual为临时表,我们可以根据mysql提供得函数 NOT EXISTS 对数据进行有条件得筛选,这样如果子查询语句 查询不到对应得数据,我们进行插入,如果可以查询到对应得数据我们不进行任何操作了就。
除此之外 我们也可以使用 REPLACE INTO 进行操作
REPLACE INTO tbTest
SET strEventType = 1,
lCustomerId = 1,
strTimeFlag = 1,
nCount = 2;
该语句当表中存在该数据时进行更新,如果不存在进行插入,需要注意得是,执行该语句,如果记录已经存在会先将原记录删除,然后在插入新数据!