【www.gdgbn.com--php与数据库】

replace语法
replace [low_priority | delayed]    [into] tbl_name [(col_name,...)]    values ({expr | default},...),(...),...或:

replace [low_priority | delayed]    [into] tbl_name    set col_name={expr | default}, ...或:

replace [low_priority | delayed]    [into] tbl_name [(col_name,...)]    select ...replace的运行与insert很相像。只有一点除外,如果表中的一个旧记录与一个用于primary key或一个unique索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。请参见13.2.4节,“insert语法”。

注意,除非表有一个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
用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。

语法
replace ( ""string_replace1"" , ""string_replace2"" , ""string_replace3"" )

参数
""string_replace1""

待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。

""string_replace2""

待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。

""string_replace3""

替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。

返回类型
如果 string_replace(1、2 或 3)是支持的字符数据类型之一,则返回字符数据。如果 string_replace(1、2 或 3)是支持的 binary 数据类型之一,则返回二进制数据。

示例
下例用 xxx 替换 abcdefghi 中的字符串 cde。

select replace(""abcdefghicde"",""cde"",""xxx"")go
下面是结果集:

------------abxxxfghixxx(1 row(s) affected)

 

本文来源:http://www.gdgbn.com/jiaocheng/28385/