mysql中replace的用法
在修改表中某些记录内容,用于将该字段中的部分内容替换掉,这正是该函数存在的意义。replace用法1、replace(object,search,replace)
replace替换函数语法:
update TABLE set FIELD_NAME =replace(FIELD_NAME,"find this string","replace found string with this string");
replace替换函数案例:
update client_table set url =replace(url,"unixadi.info","freeoa.net")
这样就能将MySQL中所有字符串替换成新的了。
实例说明:
UPDATE tb1 SET f1=REPLACE(fd, 'abc', 'def');
REPLACE(str,from_str,to_str)
在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串。下列是将news表中的titleimgurl字段中的'http://192.168.0.168/newsweb_pic'替换为'freeoa_img'。
update news set titleImgUrl=replace(titleImgUrl,'http://192.168.0.168/newsweb_pic','freeoa_img') where titleImgUrl regexp '192.168.0.168/newsweb_pic';
2、replace into
在向表中插入数据的时候,常遇到这样的情况:1. 首先判断数据是否存在;2. 如果不存在,则插入;3.如果存在,则更新。
replace into table (id,name) values('1','aa'),('2','bb')此语句的作用是向表table中插入两条记录,如果主键id为1或2不存在。
就相当于
insert into table (id,name) values('1','aa'),('2','bb')
如果存在相同的值则不会插入数据 。
replace into 有三种形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,有下列三种情形:
1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
2. 否则直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
很多使用REPLACE INTO的场景,实际上需要的是INSERT INTO … ON DUPLICATE KEY UPDATE。
如果在已经存在某条记录的表上执行同一主键值的操作可以看到 MySQL 说 “2 rows affected”,可是明明是只写一条记录,为什么呢?这是因为 MySQL 在执行 REPLACE INTO freeoa (k) VALUES (1) 时首先尝试 INSERT INTO freeoa (k) VALUES (1),但由于已经存在一条 k=1 的记录,发生了 duplicate key error,于是 MySQL 会先删除已有的那条 k=1 即 id=1 的记录,然后重新写入一条新的记录。即MySQL 在数据冲突时实际上是删掉了旧记录,再写入新记录,在从机上如果该字段有AUTO_INCREMENT属性的话则会有影响。另外如果没有再语句中指定原语句中存在的有内容字段时,则该字段内容会丢失。
replace
当没有key时,replace相当于普通的insert。
当有key时,可以理解为删除重复key的记录,在保持key不变的情况下,delete原有记录,再insert新的记录,新纪录的值只会录入replace语句中字段的值,其余没有在replace语句中的字段,会自动填充默认值。
Insert into ..... on duplicate key update
insert into ct(id,name) select '3','japan' on duplicate key update name='japan';
Query OK, 2 rows affected (0.03 sec)
Records: 1 Duplicates: 1 Warnings: 0
这表示当key有时,只执行后面的udate操作语句。
来看一下主键id不存在的情况:
insert into ct(name,creatime) select 'banama',now();
insert into ct(id,name,creatime) select '16','cancda',now() on duplicate key update name='cancda';
总结一下replace与'insert into ..... on duplicate key update'
(1),没有key的时候,replace与insert .. on deplicate udpate相同。
(2),有key的时候,都保留主键值。
不同之处:有key的时候,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如例子中c字段的值会被自动填充为默认值。而insert .. deplicate update则只执行update标记之后的sql,从表象上来看相当于一个简单的update语句。
所以两者的区别只有一个,insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值。从底层执行效率上来讲,replace要比insert .. on deplicate update效率要高,但是在写replace的时候,字段要写全,防止老的字段数据被删除。