MySQL快速回顾:插入操做

前提要述:参考书籍《MySQL必知必会》mysql

《MySQL必知必会》是先讲了查询,可是没有记录就没法查询,因此先将如何添加数据。sql

表已经知道怎么建立了,随便创两张。数据库

5.1 插入数据

MySQL使用 INSERT来插入(或添加)行(记录)到数据库表中。插入可用如下几种方式使用:安全

  • 插入完整的行(记录);
  • 插入行的一部分;
  • 插入多行;
  • 插入某些查询结果。

5.2 插入完整的行(记录)

什么叫完整的行,即插入的有效数据均可以对应表中的每一列。性能

把数据插入表中,最简单的方法是使用基本的INSERT语法,须要指定表名和被插入到新行中的值,格式:code

# 写法:
INSERT INTO <table_name> VALUES(value1,value2,...);
# 规范写法:
INSERT INTO <table_name>(field1, field2, ...) VALUES(value1,value2,...);

解释:索引

  • 若是使用第一种写法,虽然很简单,可是并不安全,应该尽可能避免使用。由于该语句高度依赖于表中列的次序,而且还依赖其次序容易得到的信息。即便可获得这种次序信息,也不能保证下次表结构变更后各个列保持彻底相同的次序。因此在开发中若是这样写,那么就是把插入语句写死了。由于数据库表中的列的顺序有可能可能会改变,一旦改变,就会出现致命错误,好比:一个varchar类型的可能会被插入到char中,若是超长度可能会报错,并且varchar是大范围而char是小范围,可能会致使数据丢失;而若是一个浮点型的数据由于列顺序的改变插入到了一个整型的列中,这又不会报错,因此也很难找错。
  • 推荐使用规范写法,特别是在开发时编写sql语句。由于一旦指定列名,那么VALUES必须以其指定的次序匹配指定的列名,不必定按各个列出如今实际表中的次序。 因此即便表的结构改变,此INSERT语句仍然能够正确工做。
  • 第一种写法必须完整的给出表中的所有列的值,而且还得按照表中列的次序;而规范写法不用,由于会根据 (field1, field2, ...)来进行赋值,即便跟表中的列的次序不同,或者一些列不想赋值。

例子:在学生表中插入数据开发

INSERT INTO student(stu_id, stu_name, stu_sex)  VALUES(1, '张三', '男');

注意:字符串或字符须要使用''(单引号)圈起来。字符串

输出:若是成功的话table

Query OK, 1 row affected (0.01 sec)

而若是在主键使用了自增加(AUTO_INCREMENT),那么则能够这样写

INSERT INTO student(stu_id, stu_name, stu_sex)  VALUES(null, '张三', '男');

或者,不写主键:

INSERT INTO student(stu_name, stu_sex)  VALUES('张三', '男');

也就是插入时,在主键的位置直接插入null或者不写默认就是赋给null,MySQL会由于AUTO_INCREMENT本身给它赋值。


  • 若是对表中不容许NULL值且没有默认值的列不给出值(插入时省略了),则MySQL将产生一条错误信息,而且相应的行插入不成功。
  • 规范写法哪些列能够省略不写:
    • 该列定义为容许NULL值(无值或空值);
    • 在表定义中给出默认值。也就表示若是在插入时不给出值,就会使用默认值;
    • 使用AUTO_INCREMENT的列。
  • INSERT操做可能很耗时(特别是有不少索引须要更新时),并且它可能下降等待处理的SELECT语句的性能。若是数据检索是最重要的,则能够经过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL下降INSERT语句的优先级。
INSERT LOW_PRIORITY INTO
  • UPDATE操做和DELETE操做也适用。

5.3 插入多个行

INSERT能够插入一行到一个表中,也能够插入多行到一个表中,第一种方式就是写多条INSERT语句,还有一种方式就是在一条INSERT语句中插入多行。

语法:

INSERT INTO <table_name>(
    field1,
    field2,
    ...
    )
    VALUES(
        valueA1,
        valueA2,
        ...
        ),
        (
        valueB1,
        valueB2,
        ...
    );

此写法能够提供INSERT的性能,由于MySQL用单条INSERT语句处理多个插入比使用多条INSERT快。

5.4 插入检索出的数据

INSERT语句能够利用一条SELECT语句查询的结果插入到表中。也就是所谓的INSERT SELECT,它是由一条INSERT语句和一条SELECT语句构成。

好比我须要把一张表的数据复制到另外一张表,语法:

INSERT INTO <new_table_name>(field1, field2, ...) 
    SELECT field1, field2 FROM <old_table_name>;
# 或 也就是列名能够不一样
INSERT INTO <new_table_name>(field1, field2, ...) 
    SELECT f1, f2 FROM <old_table_name>;

注意:若是新表不存在则报错。
解释:

  • 先使用SELECT语句从旧表中查询出数据,而后再使用INSERT语句把查询的结果插入到新表中。
  • SELECT列出的每个列对应于 后所跟的列表中的每个列。
  • 若是 为空,即没有行能够插入也不会报错。
  • 若是能保证从旧表导入到新表(假设新表有数据)的主键值不会重复,那么插入时能够省略这主键,好比有AUTO_INCREMENT的主键就能够省略。
  • 在INSERT和SELECT语句中使用相同的列名,可是不必定要求列名匹配。实际上,MySQL甚至不关心SELECT返回的列名。它使用的是列的位置,所以SELECT中的第一列(无论列名)将用来填充表列中指定的第一个列,第二列将用来填充表列中指定的第二列等。
  • INSERT SELECT中SELECT语句可包含WHERE子句以过滤插入的数据。
相关文章
相关标签/搜索