="t18">Replace INTO和INSERT INTO
![](/icons/85612de.gif)
区别:
REPLACE
![](/icons/85612de.gif)
运行和INSERT很相似
![](/icons/85612dou2.gif)
只有
![](/icons/85612yi.gif)
点例外
![](/icons/85612dou.gif)
假如表中
![](/icons/85612de.gif)
![](/icons/85612yi.gif)
个旧记录和
![](/icons/85612yi.gif)
个用于PRIMARY KEY或
![](/icons/85612yi.gif)
个UNIQUE索引
![](/icons/85612de.gif)
新记录具有相同
![](/icons/85612de.gif)
值
![](/icons/85612dou.gif)
则在新记录被插入的前
![](/icons/85612dou.gif)
旧记录被删除
![](/icons/85612dou2.gif)
注意
![](/icons/85612dou.gif)
除非表有
![](/icons/85612yi.gif)
个PRIMARY KEY或UNIQUE索引
![](/icons/85612dou.gif)
否则
![](/icons/85612dou.gif)
使用
![](/icons/85612yi.gif)
个REPLACE语句没有意义
![](/icons/85612dou2.gif)
该语句会和INSERT相同
![](/icons/85612dou.gif)
![](/icons/85612yinwei.gif)
没有索引被用于确定是否新行复制了其它
![](/icons/85612de.gif)
行
![](/icons/85612dou2.gif)
所有列
![](/icons/85612de.gif)
值均取自在REPLACE语句中被指定
![](/icons/85612de.gif)
值
![](/icons/85612dou2.gif)
所有缺失
![](/icons/85612de.gif)
列被设置为各自
![](/icons/85612de.gif)
默认值
![](/icons/85612dou.gif)
这和INSERT
![](/icons/85612yi.gif)
样
![](/icons/85612dou2.gif)
您不能从当前行中引用值
![](/icons/85612dou.gif)
也不能在新行中使用值
![](/icons/85612dou2.gif)
如果您使用
![](/icons/85612yi.gif)
个例如“SET col_name = col_name + 1”
![](/icons/85612de.gif)
赋值
![](/icons/85612dou.gif)
则对位于右侧
![](/icons/85612de.gif)
列名称
![](/icons/85612de.gif)
引用会被作为DEFAULT(col_name)处理
![](/icons/85612dou2.gif)
因此
![](/icons/85612dou.gif)
该赋值相当于SET col_name = DEFAULT(col_name) + 1
![](/icons/85612dou2.gif)
为了能够使用REPLACE
![](/icons/85612dou.gif)
您必须同时拥有表
![](/icons/85612de.gif)
INSERT和DELETE权限
![](/icons/85612dou2.gif)
REPLACE语句会返回
![](/icons/85612yi.gif)
个数
![](/icons/85612dou.gif)
来指示受影响
![](/icons/85612de.gif)
行
![](/icons/85612de.gif)
数目
![](/icons/85612dou2.gif)
该数是被删除和被插入
![](/icons/85612de.gif)
行数
![](/icons/85612de.gif)
和
![](/icons/85612dou2.gif)
如果对于
![](/icons/85612yi.gif)
个单行REPLACE该数为1
![](/icons/85612dou.gif)
则
![](/icons/85612yi.gif)
行被插入
![](/icons/85612dou.gif)
同时没有行被删除
![](/icons/85612dou2.gif)
如果该数大于1
![](/icons/85612dou.gif)
则在新行被插入前
![](/icons/85612dou.gif)
有
![](/icons/85612yi.gif)
个或多个旧行被删除
![](/icons/85612dou2.gif)
如果表包含多个唯
![](/icons/85612yi.gif)
索引
![](/icons/85612dou.gif)
并且新行复制了在区别
![](/icons/85612de.gif)
唯
![](/icons/85612yi.gif)
索引中
![](/icons/85612de.gif)
区别旧行
![](/icons/85612de.gif)
值
![](/icons/85612dou.gif)
则有可能是
![](/icons/85612yi.gif)
个单
![](/icons/85612yi.gif)
行替换了多个旧行
![](/icons/85612dou2.gif)
受影响
![](/icons/85612de.gif)
行数可以容易地确定是否REPLACE只添加了
![](/icons/85612yi.gif)
行
![](/icons/85612dou.gif)
或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)
![](/icons/85612dou2.gif)
如果您正在使用C API
![](/icons/85612dou.gif)
则可以使用mysql_affected_rows
![](/icons/85612kh.gif)
![](/icons/85612hanshu.gif)
获得受影响
![](/icons/85612de.gif)
行数
![](/icons/85612dou2.gif)
目前
![](/icons/85612dou.gif)
您不能在
![](/icons/85612yi.gif)
个子查询中
![](/icons/85612dou.gif)
向
![](/icons/85612yi.gif)
个表中更换
![](/icons/85612dou.gif)
同时从同
![](/icons/85612yi.gif)
个表中选择
![](/icons/85612dou2.gif)
下文时算法
![](/icons/85612de.gif)
详细介绍说明(此算法也用于LOAD DATA…REPLACE):
1. 尝试把新行插入到表中
2. 当
![](/icons/85612yinwei.gif)
对于主键或唯
![](/icons/85612yi.gif)
关键字出现重复关键字
![](/icons/85612cuowu.gif)
而造成插入失败时:
a. 从表中删除含有重复关键字值
![](/icons/85612de.gif)
冲突行
b. 再次尝试把新行插入到表中
使用格式如下:
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 …