Replace INTO和INSERT INTO的区别:
REPLACE的运⾏与INSERT很相似。只有⼀点例外,假如表中的⼀个旧记录与⼀个⽤于PRIMARY KEY或⼀个UNIQUE 索引的新记录具有相同的值,则在新记录被插⼊之前,旧记录被删除。
注意,除⾮表有⼀个PRIMARY KEY或UNIQUE索引,否则,使⽤⼀个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被⽤于确定是否新⾏复制了其它的⾏。
所有列的值均取⾃在REPLACE语句中被指定的值。所有缺失的列被设置为各⾃的默认值,这和INSERT⼀样。您不能从当前⾏中引⽤值,也不能在新⾏中使⽤值。如果您使⽤⼀个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引⽤会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
为了能够使⽤REPLACE,您必须同时拥有表的INSERT和DELETE权限。
REPLACE语句会返回⼀个数,来指⽰受影响的⾏的数⽬。该数是被删除和被插⼊的⾏数的和。如果对于⼀个单⾏REPLACE该数为1,则⼀⾏被插⼊,同时没有⾏被删除。如果该数⼤于1,则在新⾏被插⼊前,有⼀个或多个旧⾏被删除。如果表包含多个索引,并且新⾏复制了在不同的索引中的不同旧⾏的值,则有可能是⼀个单⼀⾏替换了多个旧⾏。
受影响的⾏数可以容易地确定是否REPLACE只添加了⼀⾏,或者是否REPLACE也替换了其它⾏:检查该数是否为
1(添加)或更⼤(替换)。
如果您正在使⽤C API,则可以使⽤mysql_affected_rows()函数获得受影响的⾏数。
⽬前,您不能在⼀个⼦查询中,向⼀个表中更换,同时从同⼀个表中选择。
下⽂时算法的详细说明(此算法也⽤于LOAD DATA…REPLACE):
1. 尝试把新⾏插⼊到表中
2. 当因为对于主键或关键字出现重复关键字错误⽽造成插⼊失败时:
a. 从表中删除含有重复关键字值的冲突⾏
b. 再次尝试把新⾏插⼊到表中
使⽤格式如下:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},…),(…),…
或:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_namereplace into
SET col_name={expr | DEFAULT}, …
或:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT …
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论