zoukankan      html  css  js  c++  java
  • MySQL知识[INSERT语法]

    INSERT语法

    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        VALUES ({expr | DEFAULT},...),(...),...
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

    或:

    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name
        SET col_name={expr | DEFAULT}, ...
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

    或:

    INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        SELECT ...
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

    INSERT用于向一个已有的表中插入新行。INSERT...VALUESINSERT...SET形式的语句根据明确指定的值插入行。INSERT...SELECT形式的语句插入从其它表中选出的行。

    行应被插入到tbl_name表中。可以按以下方法指定列。本语句向这些列提供值。

    ·         列名称清单或SET子句明确的指示了列。

    ·         如果您不为INSERT...VALUESINSERT...SELECT指定列的清单,则表中每列的值必须在VALUES清单中提供,或由SELECT提供。如果您不知道表中各列的顺序,则使用DESCRIBE tbl_name查询。

    列值可以采用多种方法给定:

    ·         如果不是在严格模式下运行,则所有没有明确给定值的列都被设置为默认值(明确的或隐含的)。例如,如果您指定了一个列清单,但此清单没有对表中所有的列进行命名,则未命名的各列被设置为默认值。

    有时候,您需要对所有没有默认值的列明确地指定值。如果您希望,在没有明确指定值时,INSERT语句可以生成错误信息,则您应该使用STRICT模式。

    ·         使用关键词DEFAULT,明确地把列设置为默认值。这样,编写向所有列赋值的INSERT语句时可以更容易,因为使用DEFAULT可以避免编写出不完整的、未包含全部列值的VALUES清单。如果不使用DEFUALT,您必须编写一个列名称清单,与VALUES清单中的每个值对应。

    您还可以使用DEFAULT(col_name)作为一种更通用的形式,在表达式中使用,用于生成一个列的默认值。

    ·         如果列清单和VALUES清单均为空清单,则INSERT会创建一个行,每个列都被设置为默认值:

    ·                mysql> INSERT INTO tbl_name () VALUES();

    STRICT模式中,如果有一列没有默认值,则会出现错误。或者,MySQL会对所有没有明确定义默认值的列使用隐含的默认值。

    ·         您可以指定一个表达式expr来提供一个列值。如果表达式的类型与列值不匹配,这样做会造成类型转化。并且,给定值的转化会导致不同的插入值,插入何值由列类型而定。例如,向一个INT, FLOAT, DECIMAL(10,6)YEAR列插入字符串'1999.0e-2',插入值分别是199919.992119.9921001999。存储在INTYEAR列中的值为1999的原因是,在从字符串到整数的转化中,只把字符串的前面部分看作有效的整数或年份。对于浮点列和固定点列,在从字符串到浮点的转化中,把整个字符串均看作有效的浮点值。

    表达式expr可以引用在值清单中已设置的所有列。例如,您可以这么操作,因为用于col2的值引用了col1,而col1已经被赋值:

    mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

    但是以下语句不合法,因为用于col1的值引用了col2,而col2col1之后被赋值:

    mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

    有一种例外情况,那就是含有AUTO_INCREMENT值的列。因为AUTO_INCREMENT值在其它值赋值之后被生成,所以任何在赋值时对AUTO_INCREMENT列的引用都会返回0

    INSERT语句支持下列修改符:

    ·         如果您使用DELAYED关键字,则服务器会把待插入的行放到一个缓冲器中,而发送INSERT DELAYED语句的客户端会继续运行。如果表正在被使用,则服务器会保留这些行。当表空闲时,服务器开始插入行,并定期检查是否有新的读取请求。如果有新的读取请求,则被延迟的行被延缓执行,直到表再次空闲时为止。

    ·         如果您使用LOW_PRIORITY关键词,则INSERT的执行被延迟,直到没有其它客户端从表中读取为止。当原有客户端正在读取时,有些客户端刚开始读取。这些客户端也被包括在内。此时,INSERT LOW_PRIORITY语句等候。因此,在读取量很大的情况下,发出INSERT LOW_PRIORITY语句的客户端有可能需要等待很长一段时间(甚至是永远等待下去)。(这与INSERT DELAYED形成对比,INSERT DELAYED立刻让客户端继续执行。注意LOW_PRIORITY通常不应用于MyISAM表,因为这么做会取消同时进行的插入。

    ·         如果您指定了HIGH_PRIORITY,同时服务器采用--low-priority-updates选项启动,则HIGH_PRIORITY将覆盖--low-priority-updates选项。这么做还会导致同时进行的插入被取消。

    ·         使用mysql_affected_rows() C API函数,可以获得用于INSERT的受影响行的值。

    ·         如果您在一个INSERT语句中使用IGNORE关键词,在执行语句时出现的错误被当作警告处理。例如,没有使用IGNORE时,如果一个行复制了原有的UNIQUE索引或PRIMARY KEY值,会导致出现重复关键字错误,语句执行失败。使用IGNORE时,该行仍然未被插入,但是不会出现错误。IGNORE未被指定时,如果数据转化引发错误,则会使语句执行失败。使用IGNORE后,无效数据被调整到最接近的值,并被插入;此时,生成警告,但是语句执行不会失败。您可以使用mysql_info() C API函数测定有多少行被插入到表中。

    如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

    mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
        -> ON DUPLICATE KEY UPDATE c=c+1;
     
    mysql> UPDATE table SET c=c+1 WHERE a=1;

    如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2

    注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

    mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

    如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

    您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL

    示例:

    mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
        -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

    本语句与以下两个语句作用相同:

    mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
        -> ON DUPLICATE KEY UPDATE c=3;
    mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
        -> ON DUPLICATE KEY UPDATE c=9;

    当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

  • 相关阅读:
    初次学习Vue,输出Hello Vue!
    js的let语句在安卓手机端的QQ浏览器出错的问题
    前端框架的对比
    Vue环境搭建及node安装过程整理
    快速排序与冒泡排序(面试题)
    判断一个字符串中出现次数最多的字符并统计其出现的次数(面试题)
    Go_18: Golang 中三种读取文件发放性能对比
    GO_05_2:Golang 中 panic、recover、defer 的用法
    Go_17:GoLang中如何使用多参数属性传参
    Go_16:GoLang中flag标签使用
  • 原文地址:https://www.cnblogs.com/kingangWang/p/2163476.html
Copyright © 2011-2022 走看看