10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.6 mb
PDF (A4)- 41.7 mb
手册(TGZ)- 262.1 kb
手册(Zip)- 372.1 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

13.2.6 INSERT语句

插入[low_priority | delayed | high_priority] [ignore] [into]tbl_name(分区(partition_name(,partition_name…][(col_name(,col_name{{值|值}(value_list) [, (value_list)]…|值row_constructor_list} (row_alias((col_alias(,col_alias重复密钥更新assignment_listinsert [low_priority | delayed | high_priority] [ignore] [into]tbl_name(分区(partition_name(,partition_name[as .] [as .row_alias((col_alias(,col_alias[中文]集合assignment_list重复密钥更新assignment_listinsert [low_priority | high_priority] [ignore] [into]tbl_name(分区(partition_name(,partition_name…][(col_name(,col_name[as .] [as .row_alias((col_alias(,col_alias…)]]{选择…|表table_name}[重复密钥更新。assignment_list价值:{expr|默认}value_list价值(,价值)……row_constructor_list:行(value_list)、行(value_list)][……]赋值col_name= (row_alias)价值assignment_list赋值(,赋值)……

插入向现有表中插入新行。的插入……值插入……值行(),插入……集语句的形式基于显式指定的值插入行。的插入……选择表单插入从另一个或多个表中选择的行。你也可以用插入……表格在MySQL 8.0.19及以后的版本中从单个表中插入行。插入与一个重复密钥更新子句允许更新现有行,如果要插入的行将导致类中的值重复独特的索引或主键.在MySQL 8.0.19及更高版本中,可以使用带有一个或多个可选列别名的行别名重复密钥更新引用要插入的行。

有关有关插入……选择而且插入……重复密钥更新,请参阅第13.2.6.1节,“INSERT…SELECT语句”,第13.2.6.2节,“插入…关于重复密钥更新声明"

在MySQL 8.0中延迟关键字被接受,但被服务器忽略。至于原因,请看第13.2.6.3节,“插入延迟语句”

插入到表中需要插入该表的特权。如果重复密钥更新子句,重复的键会导致更新反之,该语句需要更新要更新的列的权限。对于已读取但未修改的列,只需要选择权限(例如对于仅在控件的右侧引用的列col_nameexpr转让重复密钥更新条款)。

在插入到分区表时,可以控制哪些分区和子分区接受新行。的分区子句获取表的一个或多个分区或子分区(或两个)的名称以逗号分隔的列表。如果任何行要被给定的插入插入语句与列出的分区之一不匹配插入语句失败,出现错误发现与给定分区集不匹配的行.有关更多信息和示例,请参见第24.5节,“分区选择”

tbl_name要将行插入其中的表。指定语句提供值的列如下所示:

  • 在表名后面提供用圆括号括起来的列名称列表,列名称用逗号分隔。控件必须为每个命名列提供一个值列表,值行()列表,或者选择声明。为插入表形式时,源表中的列数必须与要插入的列数匹配。

  • 如果不指定列名称列表插入……值插入……选择,表中每一列的值必须由列表,选择声明中,或表格声明。如果不知道表中列的顺序,请使用描述tbl_name为了找到答案。

  • 一个子句通过名称显式地指示列,以及为每个列分配的值。

列值可以通过几种方式给出:

  • 如果没有启用严格SQL模式,则任何未显式给出值的列将被设置为其默认(显式或隐式)值。例如,如果指定的列列表不指定表中的所有列的名称,则将未命名的列设置为它们的默认值。默认值分配在第11.6节“数据类型默认值”.另请参阅第1.7.3.3节“对无效数据的强制约束”

    如果启用了严格的SQL模式,则会导致一个错误插入语句如果没有为每个没有默认值的列指定显式值,则会生成错误。看到第5.1.11节,“Server SQL模式”

  • 如果列列表和列表为空,插入创建一个行,每个列都设置为默认值:

    插入tbl_name()()值;

    如果没有启用严格模式,MySQL将对没有显式定义默认值的任何列使用隐式默认值。如果启用了严格模式,如果任何列没有默认值,就会发生错误。

  • 使用关键字默认的显式地将列设置为其默认值。这样写起来更容易插入语句,为除少数列外的所有列赋值,因为它使您能够避免编写不完整的列表,该列表不包含表中每列的值。控件中的每个值对应的列名列表列表。

  • 如果显式插入生成的列,则唯一允许的值为默认的.有关已生成列的信息,请参见第13.1.20.8节“创建表和生成的列”

  • 在表达式中,你可以使用违约(col_name为列生成默认值col_name

  • 表达式的类型转换expr如果表达式数据类型与列数据类型不匹配,则可能发生列值。给定值的转换会根据列类型产生不同的插入值。例如,插入字符串“依照1999.0”成一个INT浮动小数(10,6),或一年列插入值199919.992119.992100,或1999,分别。对象中存储的值INT而且一年1999因为字符串到数字的转换只查看字符串的初始部分中可能被认为是有效整数或年份的部分。为浮动而且小数列时,字符串到数字转换将整个字符串视为有效的数值。

  • 一个表达式expr可以引用先前在值列表中设置的任何列。例如,您可以这样做,因为值Forcol2是指col1,之前已分配:

    插入tbl_name(col2 col1值(15日col1 * 2);

    但以下是不合法的,因为值为col1是指col2后分配col1

    插入tbl_name(col2 col1值(col2 * 2、15);

    包含。的列会出现异常AUTO_INCREMENT值。因为AUTO_INCREMENT对象的任何引用都是在其他值赋值之后生成的AUTO_INCREMENT列返回一个0

插入语句使用语法可以插入多行。要做到这一点,需要包含多个用逗号分隔的列值列表,列表用圆括号括起来,并用逗号分隔。例子:

插入tbl_name(a,b,c) VALUES(1,2,3), (4,5,6), (7,8,9);

每个值列表必须包含每行要插入的值。下面的语句无效,因为它包含一个包含9个值的列表,而不是三个每个包含3个值的列表:

插入tbl_name(a, b, c)值(1,2,3,4,5,6,7,8,9);

价值是的同义词吗在这种情况下。两者都没有暗示任何关于值列表的数量,也没有暗示每个列表的值的数量。无论有单个值列表还是多个列表,都可以使用这两种方法,也不管每个列表的值的数量。

插入语句的使用值行()语法还可以插入多行。在这种情况下,每个值列表必须包含在行()(行构造函数),像这样:

插入tbl_name(a, b, c)值行(1、2、3)、行(4、5、6)、行(7 8 9);

的受影响行值插入可通过ROW_COUNT ()SQL函数或mysql_affected_rows ()C API函数。看到第12.16条“资讯功能”,mysql_affected_rows ()

如果你使用插入……值插入……值行()使用多个值列表,或者插入……选择插入……表格,语句返回如下格式的信息字符串:

记录:N1副本:N2警告:N3

如果正在使用C API,则可以通过调用mysql_info ()函数。看到mysql_info ()

记录指示语句处理的行数。(这不一定是实际插入的行数,因为重复的可以是非零的。)重复的指示不能插入的行数,因为它们会重复某些现有的惟一索引值。警告指示插入在某些方面有问题的列值的尝试次数。在以下任何情况下都可能出现警告:

  • 插入到已声明的列中非空.对多行插入语句或插入…选择语句中,将列设置为列数据类型的隐式默认值。这是0对于数值类型,空字符串()用于字符串类型,而值的日期和时间类型。插入…选择语句的处理方式与多行插入相同,因为服务器不检查来自选择查看它是否返回单行。(单排的插入时,没有警告发生插入到非空列。相反,该语句失败并出现错误。)

  • 将数值列设置为列范围之外的值。该值被剪切到范围的最近端点。

  • 赋值,例如“10.34”到一个数字列。去掉后面的非数字文本,然后插入剩下的数字部分。如果字符串值没有前导数字部分,则将列设置为0

  • 将字符串插入字符串列(字符VARCHAR文本,或),超出列的最大长度。该值被截断为列的最大长度。

  • 在日期或时间列中插入对数据类型来说是非法的值。列被设置为类型的适当零值。

  • 插入例子包括AUTO_INCREMENT列值,请参见第3.6.9节“使用AUTO_INCREMENT”

    如果插入属性的表中插入一行AUTO_INCREMENT方法,可以找到用于该列的值LAST_INSERT_ID ()SQL函数或mysql_insert_id ()C API函数。

    请注意

    这两个函数的行为并不总是相同的。的行为插入关于…的陈述AUTO_INCREMENT列将在后面讨论第12.16条“资讯功能”,mysql_insert_id ()

插入语句支持以下修饰符:

  • 如果您使用LOW_PRIORITY修饰符,执行插入延迟到没有其他客户机从表中读取为止。这包括在现有客户端阅读时开始阅读的其他客户端,以及插入LOW_PRIORITY语句正在等待。因此,对于发出插入LOW_PRIORITY语句要等待很长时间。

    LOW_PRIORITY只影响只使用表级锁定(如MyISAM内存,合并).

    请注意

    LOW_PRIORITY通常不应该与MyISAM表,因为这样做会禁用并发插入。看到第8.11.3节“并发插入”

  • 如果你指定HIGH_PRIORITY时,它将覆盖——low-priority-updates选项,如果服务器是用该选项启动的。它还会导致不使用并发插入。看到第8.11.3节“并发插入”

    HIGH_PRIORITY只影响只使用表级锁定(如MyISAM内存,合并).

  • 如果您使用忽略修饰符时,可忽略的错误插入语句被忽略。例如,没有忽略,复制现有的独特的索引或主键值将导致重复键错误,语句将中止。与忽略,该行被丢弃,不会发生错误。被忽略的错误会生成警告。

    忽略对于在没有找到与给定值匹配的分区的分区表中插入具有类似的效果。没有忽略,这样的插入语句会因错误而中止。当插入忽略时,对于包含不匹配值的行,插入操作将静默失败,而插入匹配的行。示例请参见第24.2.2节,“LIST分区”

    将触发错误的数据转换将中止语句忽略没有指定。与忽略,将无效值调整到最接近的值并插入;会产生警告,但语句不会中止。你可以用mysql_info ()C API函数实际插入到表中的行数。

    有关更多信息,请参见IGNORE对语句执行的影响

    你可以用取代而不是插入覆盖旧行。取代是对应的插入忽略在处理包含重复旧行的唯一键值的新行时:新行替换旧行,而不是丢弃。看到第13.2.9节,“REPLACE语句”

  • 如果你指定重复密钥更新,然后插入一行,该行将导致类中的值重复独特的索引或主键,一个更新发生旧行的。如果将该行作为新行插入,则每行受影响的行值为1,如果更新了现有行,则为2,如果将现有行设置为当前值,则为0。如果指定CLIENT_FOUND_ROWS标志到mysql_real_connect ()C API函数mysqld,如果将现有行设置为当前值,则受影响的行值为1(而不是0)。看到第13.2.6.2节,“插入…关于重复密钥更新声明"

  • 插入延迟在MySQL 5.6中已弃用,并计划最终删除。在MySQL 8.0中延迟修饰符被接受但被忽略。使用插入(没有延迟)。看到第13.2.6.3节,“插入延迟语句”