插入[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_name
=expr
转让重复密钥更新
条款)。
在插入到分区表时,可以控制哪些分区和子分区接受新行。的分区
子句获取表的一个或多个分区或子分区(或两个)的名称以逗号分隔的列表。如果任何行要被给定的插入插入
语句与列出的分区之一不匹配插入
语句失败,出现错误发现与给定分区集不匹配的行.有关更多信息和示例,请参见第24.5节,“分区选择”.
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)
,或一年
列插入值1999
,19.9921
,19.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
.在日期或时间列中插入对数据类型来说是非法的值。列被设置为类型的适当零值。
为
插入
例子包括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节,“插入延迟语句”.