10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 本手册下载 从本手册中摘录

13.2.9替换语句

替换[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_namecol_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()函数。

您不能在子查询中替换到一个表并从同一表中进行选择。

MySQL使用以下算法代替(和加载数据...更换):

  1. 尝试将新行插入表中

  2. 插入失败,因为主键或唯一索引发生重复键错误:

    1. 从表中删除具有重复键值的冲突行

    2. 再次尝试将新行插入表中

在重复键错误的情况下,存储引擎可以执行代替作为更新而不是删除加号,但语义是相同的。除了存储引擎增量的可能差异之外,没有用户可见效果司机_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.,idTS.列值必须匹配要替换的行的现有行;否则,插入行。