10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

13.2.5 INSERT语句

插入[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是应该插入的表行。指定列的声明提供的值如下:

  • 提供一个括号的逗号分隔列表列名称的表名。在这种情况下,每个指定列的值都必须提供的列表或选择声明。

  • 如果你不指定的列名列表插入……值插入……选择、价值观对于表中的每一列都必须提供的列表或选择声明。如果你不知道的顺序列在表中,使用描述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

  • 将一个字符串插入一个字符串列(字符,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,内存,合并)。

  • 如果你使用忽略修改器,循环执行时发生的错误插入声明中被忽略。例如,没有忽略一行,复制现有的独特的索引或主键表中的值会导致重复键错误和语句将中止。与忽略,行就会被丢弃,没有发生错误。忽略错误生成警告。

    忽略也有类似的影响插入没有分区的分区表匹配一个给定的值。没有忽略,这样的插入语句失败与错误。当插入忽略静静地,插入操作失败的行包含无与伦比的价值,但插入行匹配。例如,看到的部分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,“分区和锁定”