插入[LOW_PRIORITY | |推迟HIGH_PRIORITY][忽略][到]tbl_name(分区(partition_name(,partition_name]…))((col_name(,col_name]…)]{值|值}(value_list)((value_list)]…(在复制键更新assignment_list]插入[LOW_PRIORITY | |推迟HIGH_PRIORITY][忽略][到]tbl_name(分区(partition_name(,partition_name]…)]assignment_list(在复制键更新assignment_list]插入[LOW_PRIORITY | HIGH_PRIORITY][忽略][到]tbl_name(分区(partition_name(,partition_name]…))((col_name(,col_name]…)]选择……(在复制键更新assignment_list]价值:{expr|默认}value_list:价值(,价值)……赋值:col_name=价值assignment_list:赋值(,赋值)……
插入
将新行插入一个现有表。的插入……值
和插入……集
形式的语句插入行基于显式指定值。的插入……选择
从另一个表或表形式插入行选择。插入
与一个重复关键更新
条款允许现有的行被更新如果一行插入会导致重复的值独特的
索引或主键
。
额外的信息插入……选择
和插入……重复关键更新
,请参阅部分13.2.5.1,“插入…SELECT语句”,部分13.2.5.2,“插入…重复键更新语句”。
在MySQL 5.7中,延迟
关键字被接受,但忽视了服务器。的原因,明白了部分13.2.5.3,“插入延迟声明”,
插入一个表要求插入
表的特权。如果重复关键更新
使用条款和重复的一个关键原因更新
相反,执行声明要求更新
特权的列被更新。为列,你只需要读但不修改选择
特权(比如一列只有右边的一个引用col_name
=expr
分配在一个重复关键更新
条款)。
当插入到一个分区表,可以控制哪些分区和subpartitions接受新行。的分区
条款以逗号分隔的列表的一个或多个分区的名字或subpartitions表的(或两者)。如果任何给定的行插入插入
声明中列出的一个分区不匹配,插入
语句失败与错误发现一行不匹配给定的分区设置。的更多信息和示例,请参阅22.5节,“分区选择”。
tbl_name
是应该插入的表行。指定列的声明提供的值如下:
列值可以在几个方面:
如果严格SQL模式未启用,任何列没有明确给定一个值被设置为默认(显式的或隐式的)价值。例如,如果您指定一个列列表中没有名字表中所有的列,不愿透露姓名的列设置为默认值。默认值描述的任务是11.6节,“数据类型默认值”。另请参阅部分1.7.3.3,“限制无效数据”。
如果启用了SQL模式严格,一个
插入
语句生成一个错误如果没有指定一个显式的值每一列没有默认值。看到部分5.1.10,“服务器SQL模式”。如果两列列表和
值
列表是空的,插入
创建一个行与每一列设置为默认值:插入tbl_name()()值;
如果严格模式未启用,MySQL使用隐式默认值没有明确定义默认的任何列。如果启用了严格的模式,出现错误如果任何列没有默认值。
使用关键字
默认的
显式地将一个列设为默认值。这使它更容易编写插入
语句赋值除了几列,因为它使您能够避免编写一个不完整的值
列表中不包含对于表中的每一列的值。否则,你必须提供相对应的列名列表中的每个值值
列表。如果一个生成的列插入明确,唯一允许的值
默认的
。生成的列的信息,请参阅部分13.1.18.7,“创建表和生成的列”。在表达式中,您可以使用
违约(
列的默认值col_name
)col_name
。一个表达式的类型转换
expr
,它提供了一个列值可能发生如果表达式的数据类型不匹配的列数据类型。给定值的转换会导致不同的插入值取决于列类型。例如,插入字符串“依照1999.0”
成一个INT
,浮动
,小数(10,6)
,或一年
列插入的值1999年
,19.9921
,19.992100
,或1999年
,分别。中存储的值INT
和一年
列1999年
因为string-to-number转换看起来只在尽可能多的初始字符串的一部分可能会被认为是一个有效的整数或一年。为浮动
和小数
列,string-to-number转换认为整个字符串一个有效的数值。一个表达式
expr
可以指任何列在早些时候设定一个值列表。例如,您可以这样做是因为的值col2
是指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)值(1、2、3),(4、5、6),(7 8 9);
每个值列表必须完全包含尽可能多的值插入的每一行。下面的声明是无效的,因为它包含一个九值列表,而不是三个三个值列表:
插入tbl_name(a, b, c)值(1,2,3,4,5,6,7,8,9);
价值
是一个同义词值
在这种情况下。既不意味着任何关于值列表的数量,也不需要考虑每个列表的值数。是否有可能使用一个值列表或多个列表,无论每单的数量值。
对于一个affected-rows值插入
可以使用吗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
,内存
,合并
)。如果你使用
忽略
修改器,循环执行时发生的错误插入
声明中被忽略。例如,没有忽略
一行,复制现有的独特的
索引或主键
表中的值会导致重复键错误和语句将中止。与忽略
,行就会被丢弃,没有发生错误。忽略错误生成警告。忽略
也有类似的影响插入没有分区的分区表匹配一个给定的值。没有忽略
,这样的插入
语句失败与错误。当插入忽略
静静地,插入操作失败的行包含无与伦比的价值,但插入行匹配。例如,看到的部分22.2.2,“列表分区”。数据转换,将引发错误声明如果中止
忽略
没有指定。与忽略
,调整无效值最接近值和插入;警告产生,但声明没有中止。你可以决定的mysql_info ()
C API函数实际上是多少行插入到表中。有关更多信息,请参见忽略在语句执行的效果。
您可以使用
取代
而不是插入
覆盖旧的行。取代
是对应的插入忽略
治疗新行包含独特的键值,重复旧行:新行取代旧行而不是丢弃。看到部分13.2.8,“取代声明”。如果您指定
重复关键更新
插入一行,会导致重复的值独特的
索引或主键
,一个更新
旧的行发生。每行affected-rows值是1,如果行插入一个新行,2如果一个现有的行被更新,如果现有的行被设置为当前值。如果你指定CLIENT_FOUND_ROWS
国旗的mysql_real_connect ()
当连接到C API函数mysqld,affected-rows值是1(0)如果一个现有的行被设置为当前值。看到部分13.2.5.2,“插入…重复键更新语句”。插入延迟
弃用MySQL 5.6,定于最终删除。在MySQL 5.7中,延迟
修饰符是接受但忽略。使用插入
(没有延迟
)。看到部分13.2.5.3,“插入延迟声明”。
一个插入
声明影响分区表使用一个存储引擎等MyISAM
雇佣了只有那些分区表级锁锁到哪些行实际上是插入。(等存储引擎InnoDB
不使用行级锁定,锁定分区发生。)有关更多信息,请参见部分22.6.4,“分区和锁定”。