今天介绍一下mysql中replaceinto的用法,它是insertinto的增强版。
通常我们在向表中插入数据时,可能会遇到这样的情况:首先判断数据是否存在,如果不存在则插入,如果存在则更新。
那么这种情况MySQL中应该如何实现这样的逻辑呢?答案就是使用:replaceinto。
格式举例:
replaceintotable(id,update_time)values(1,now());
或
replaceintotable(id,update_time)select1,now();
replaceinto跟insertinto功能类似,不同点在于:replaceinto首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。否则,直接插入新数据。
要注意的是,插入数据的表必须有主键或者是唯一索引!否则replaceinto会直接插入数据,这将导致表中出现重复的数据。
replaceinto有三种形式:
1.replaceintotable_name(col_name,…)values(…);
2.replaceintotable_name(col_name,…)select…;
3.replaceintotable_namesetcol_name=value,…;
第一种形式类似于insertinto的用法;
第二种replaceselect的用法也类似于insertselect,这种用法并不一定要求列名匹配,事实上,mysql甚至不关心select返回的列名,它需要的是列的位置。例如,replaceintotable1(name,title,mood)selectrname,rtitle,rmoodfromtable2;这个例子使用replaceinto从表table2中将所有数据导入到表table1中。
第三种replaceset用法类似于updateset用法,使用一个例如"SETcol_name=col_name+1"的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SETcol_name=DEFAULT(col_name)+1。
前两种形式用的多些。其中"into"关键字可以省略,不过最好加上"into",这样更加直观。另外,对于那些没有给予值的列,mysql将自动为这些列赋上默认值。