Mysql中replace与replaceinto的⽤法讲解
Mysql replace与replace into都是经常会⽤到的功能;replace其实是做了⼀次update操作,⽽不是先delete再insert;⽽replace into其实与insert into很相像,但对于replace into,假如表中的⼀个旧记录与⼀个⽤于PRIMARY KEY或⼀个UNIQUE 索引的新记录具有相同的值,则在新记录被插⼊之前,旧记录被删除。
replace是mysql ⾥⾯处理字符串⽐较常⽤的函数,可以替换字符串中的内容。类似的处理字符串的还有trim截取操作,这⾥就不在多说。
replace into 主要作⽤类似insert插⼊操作。主要的区别是replace会根据主键或者唯⼀索引检查数据是否存在,如果存在就先删除在更新。
例⼦:
#表结构:
CREATE TABLE `t_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(1) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
插⼊第⼀条记录
INSERT INTO t_test (`name`)VALUES('a')
#或者
REPLACE INTO t_test (`name`)VALUES('a')
采⽤上⾯的⽅式插⼊⼆条记录,insert into 会提⽰错误:1062 - Duplicate entry ‘a' for key ‘idx_name', Time: 0.001000s。使⽤replace into则会正常执⾏,只是id⾃增长1。
ps: replace into 中into关键字可以省略的,看起来⼀样,使⽤有点区别
exists的用法⼀、replace(object,search,replace)
把object中出现search的全部替换为replace
select replace('www.jb51','w','n') from ... ---> nnn.jb51
例:把表table中的name字段中的detail替换为description
update table set name=replace(name,'detail','description')
⼆、replace into
相当于:if not exists (select 1 from t where id = 1) insert into t(id, update_time) values(1, getdate()) else update t set update_time = getdate() where id = 1;
REPLACE的运⾏与INSERT很相像。如果表中的⼀个旧记录与⼀个⽤于PRIMARY KEY或⼀个UNIQUE索引的新记录具有相同的值,则在新记录被插⼊之前,旧记录被删除。
注意,除⾮表有⼀个PRIMARY KEY或UNIQUE索引,否则,使⽤⼀个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被⽤于确定是否新⾏复制了其它的⾏。
所有列的值均取⾃在REPLACE INTO语句中被指定的值。所有缺失的列被设置为各⾃的默认值,这和I
NSERT INTO⼀样。您不能从当前⾏中引⽤值,也不能在新⾏中使⽤值。如果您使⽤⼀个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引⽤会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
使⽤REPLACE INTO,必须拥有表的INSERT和DELETE权限。
REPLACE语句会返回⼀个数,来指⽰受影响的⾏的数⽬。该数是被删除和被插⼊的⾏数的和。如果对于⼀个单⾏REPLACE 该数为1,则⼀⾏被插⼊,同时没有⾏被删除。如果该数⼤于1,则在新⾏被插⼊前,有⼀个或多个旧⾏被删除。如果表包含多个唯⼀索引,并且新⾏复制了在不同的唯⼀索引中的不同旧⾏的值,则有可能是⼀个单⼀⾏替换了多个旧⾏。
受影响的⾏数可以容易地确定是否REPLACE只添加了⼀⾏,或者是否REPLACE也替换了其它⾏:检查该数是否为1(添加)或更⼤(替换)。
⽬前,您不能在⼀个⼦查询中,向⼀个表中更换,同时从同⼀个表中选择。
以下是所⽤算法的更详细的说明(该算法也⽤于REPLACE):
1. 尝试把新⾏插⼊到表中
2. 当因为对于主键或唯⼀关键字出现重复关键字错误⽽造成插⼊失败时:
a. 从表中删除含有重复关键字值的冲突⾏
b. 再次尝试把新⾏插⼊到表中
三种形式:
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, ...
PS:
mysql中常⽤的三种插⼊数据的语句:
insert into表⽰插⼊数据,数据库会检查主键,如果出现重复会报错;
replace into表⽰插⼊替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则⽤新数据替换,如果没有数据效果则和insert into⼀样;
insert ignore表⽰,如果中已经存在相同的记录,则忽略当前新数据;
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。如果你想了解更多相关内容请查看下⾯相关链接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论