替换[low_priority | delayed] [into]tbl_name.[划分 (partition_name[,partition_name] ...)] [(col_name[,col_name] ...)] {{值|价值} (value_list.[,(value_list.)]…|值row_constructor_list}替换[low_priority |延迟] [进入]tbl_name.[划分 (partition_name[,partition_name]…)]assignment_list替换[low_priority | delayed] [into]tbl_name.[划分 (partition_name[,partition_name] ...)] [(col_name[,col_name)]{选择…|表table_name.}价值:{expr.|默认}value_list.:价值[,价值)……row_constructor_list:行(value_list.)、行(value_list.)] [,...]任务:col_name=价值assignment_list:任务[,任务)……
代替
正常工作插
,除了如果表中的旧行具有与新行相同的值首要的关键
或者一个独特
索引后,在插入新行之前删除旧行。看到第13.2.6节“插入声明”.
代替
是SQL标准的MySQL扩展。它是插入,或删除和插入。对于标准SQL的另一个MySQL扩展 - 插入或更新查查第13.2.6.2节,“插入…关于重复密钥更新声明".
延迟
insert和replace在MySQL 5.6中已弃用。在MySQL 8.0中,延迟
不受支持。服务器识别但忽略了延迟
关键字,将替换为Nondelayed Really,并生成一个er_warn_legacy_syntax_converted.
警告:不再支持替换延迟。该声明被转换为更换.的延迟
关键字计划在将来的释放中删除。释放。
所有列的值都取自指定的值代替
陈述。任何缺少的列都被设置为默认值,就像发生一样插
.不能引用当前行的值并在新行中使用它们。如果你使用赋值,例如集
,对右侧列名的引用被视为col_name
=col_name
+ 1默认(
,所以分配相当于col_name
)集
.col_name
=默认值(col_name
)+ 1
在MySQL 8.0.19及以后版本中,您可以指定列值代替
尝试使用值行()
.
如果显式替换生成的列,则唯一允许的值是默认的
.有关生成列的信息,请参阅第13.1.20.8节,“创建表和生成列”.
代替
支持使用的显式分区选择分区
子句具有逗号分隔的分区,子分区或两者的逗号名称。和人一样插
,如果无法将新行插入其中任何这些分区或子分区,则代替
声明失败了错误找到与给定分区集不匹配的行.有关更多信息和示例,请参阅第24.5节“分区选择”.
的代替
语句返回计数以指示受影响的行数。这是删除和插入行的总和。如果计数为单行为1代替
,插入行,没有删除行。如果计数大于1,则在插入新行之前删除了一个或多个旧行。如果表格包含多个唯一索引,并且新行以不同的唯一索引中的不同旧行复制值,则可以将单行替换多个旧行。
受影响的行计数使得易于确定是否代替
仅添加了一行或它是否也替换任何行:检查计数是否为1(添加)或更大(替换)。
如果使用C API,则可以使用受影响的行计数使用mysql_affected_rows()
函数。
您不能在子查询中替换到一个表并从同一表中进行选择。
尝试将新行插入表中
插入失败,因为主键或唯一索引发生重复键错误:
从表中删除具有重复键值的冲突行
再次尝试将新行插入表中
在重复键错误的情况下,存储引擎可以执行代替
作为更新而不是删除加号,但语义是相同的。除了存储引擎增量的可能差异之外,没有用户可见效果司机_
状态变量。XXX.
因为结果是更换...选择
语句依赖于选择
并且这个顺序不能总是得到保证,当记录源和副本的这些语句分叉时是可能的。由于这个原因,更换...选择
语句被标记为基于语句的复制不安全。使用基于语句的模式时,此类语句在错误日志中产生警告,并在使用时使用基于行的格式写入二进制日志混合
模式。也可以看看第17.2.1.1节“基于行和基于行的复制的优势和缺点”.
MySQL 8.0.19及以后版本的支持桌子
也选择
与代替
,就像它一样插
.看到第13.2.6.1节“插入... SELECT语句”,有关更多信息和示例。
修改未分区以适应分区的现有表,或者在修改已分区表的分区时,您可以考虑更改表的主键(请参阅第24.6.1节,“分区键、主键和唯一键”)。你应该知道,如果你这样做,结果代替
语句可能会受到影响,就像修改非分区表的主键一样。考虑下面创建的表创建表
陈述:
创建表测试(ID int unsigned not null auto_increment,data varchar(64)默认为null,ts TimeStamp Not Numpy Current_timestamp上的默认默认Current_timestamp,主键(ID));
当我们创建此表并运行MySQL客户端中显示的语句时,结果如下:
MySQL>替换为测试值(1,'Old','2014-08-20 18:47:00');查询确定,1行受影响(0.04秒)MySQL>替换为测试值(1,'新','2014-08-20 18:47:42');查询OK,2行受影响(0.04秒)MySQL> Select * From Test;+ ---- + ------ + -------------------- + |ID |数据|TS |+ ---- + ------ + -------------------- + |1 |新| 2014-08-20 18:47:42 | +----+------+---------------------+ 1 row in set (0.00 sec)
现在我们创建第二个表,与第一个表几乎相同,除了主键现在覆盖了2列,如下所示(强调文本):
创建表Test2(ID int unsigned not null auto_increment,data varchar(64)默认为nult,ts时间戳未返回numpy current_timestamp上的null默认current_timestamp,主键id, ts);
当我们运行时test2.
同样的两者代替
我们在原始的陈述测试
表,我们获得了不同的结果:
MySQL>替换为Test2值(1,'Old',2014-08-20 18:47:00');查询OK,1行受影响(0.05秒)MySQL>替换为Test2值(1,'新','2014-08-20 18:47:42');查询OK,1行受影响(0.06秒)mysql> select * from test2;+ ---- + ------ + -------------------- + |ID |数据|TS |+ ---- + ------ + -------------------- + |1 |老| 2014-08-20 18:47:00 | | 1 | New | 2014-08-20 18:47:42 | +----+------+---------------------+ 2 rows in set (0.00 sec)
这是由于这样一个事实,当运行test2.
,id
和TS.
列值必须匹配要替换的行的现有行;否则,插入行。