ReplaceINTO与INSERTINTO的不同之处
替换到和插入到之间的区别:
替换的工作方式很像插入。有一个例外,如果表中的旧记录与主键或唯一索引的新记录具有相同的值,则在插入新记录之前,旧记录将被删除。
请注意,除非表有主键或唯一索引,否则使用REPLACE语句是没有意义的。该语句与INSERT相同,因为没有使用索引来确定新行是否复制了其他行。
所有列的值都取自REPLACE语句中指定的值。所有缺少的列都被设置为默认值,这与INSERT相同。不能引用当前行中的值或使用新行中的值。如果使用诸如“SET col_name = col_name+1”这样的赋值,对右边列名的引用将被视为DEFAULT(col_name)。因此,这种赋值相当于set col _ name = default(col _ name)+1。
为了能够使用REPLACE,您必须对该表拥有INSERT和DELETE权限。
REPLACE语句返回一个数字来指示受影响的行数。这个数字是删除行和插入行的总和。如果单行替换的数字为1,则插入一行,不删除任何行。如果该数字大于1,则在插入新行之前会删除一个或多个旧行。如果表包含多个索引,并且新行复制不同索引中不同旧行的值,则有可能一行替换多个旧行。
受影响的行数可以很容易地确定replace是否只添加一行,或者REPLACE是否还替换其他行:检查数字是否为1 (add)或更大(REPLACE)。
如果使用C API,可以使用mysql_affected_rows()函数获得受影响的行数。
目前,您不能在子查询中更改到一个表并从同一个表中进行选择。
以下算法的详细描述(该算法也用于加载数据…替换):
1.尝试在表格中插入新行
2.当由于主键或关键字的重复关键字错误而导致插入失败时:
A.从表中删除具有重复键值的冲突行。
B.再次尝试在表格中插入新行
使用格式如下:
替换[低优先级|延迟]
[入] tbl_name [(col_name,...)]
值({expr | DEFAULT}、…)、(…)、…
或者:
替换[低优先级|延迟]
[INTO] tbl_name
SET col_name={expr | DEFAULT},…
或者:
替换[低优先级|延迟]
[入] tbl_name [(col_name,...)]
选择…
位律师回复
0条评论