MySQL必知必会——第十九章插入数据

插入数据

本章介绍如何利用SQL的INSERT语句将数据插入表中。

数据插入

SELECT语句是最常用的SQL语句。但还有其他三个经常使用的SQL语句需要学习,第一个就是INSERT。

INSERT是用来插入(或添加)行到数据库表的。插入方式有以下几种:

  • 插入完整的行。
  • 插入行的一部分。
  • 插入多行。
  • 插入某些查询的结果。

插入及系统安全 可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句。


插入完整的行

把数据插入表中最简单的方法是使用基本的INSERT语法,它要求指定表名和被插入到新行中的值。

mysql> INSERT INTO customers
    -> VALUES(NULL,
    ->     'Pep E. LaPew',
    ->     '100 Main Street',
    ->     'Los Angeles',
    ->     'CA',
    ->     '90046',
    ->     'USA',
    ->     NULL,
    ->     NULL);
Query OK, 1 row affected (0.01 sec)

没有输出 INSERT语句一般不会产生输出。

此语句插入一个新客户到customers表。存储到每个表列中的数据在VALUES子句中给出,对每个列必须提供一个值,列的次序必须按表定义出现的顺序填充。若没有值,则用NULL填充(允许NULL的列)。
第一列cust_id为自动增量,MySQL会自动填值,我们使用NULL来填充(NULL将被忽略)。

这种语法很简单,但不安全,避免使用。它高度依赖表中列的定义次序,还依赖容易获得的次序信息。即使了解了次序信息,也不能保证下一次表的结构变动后的列次序不变。

我们有更安全(烦琐)的方法:

mysql> INSERT INTO customers(cust_name,
    ->     cust_address,
    ->     cust_city,
    ->     cust_state,
    ->     cust_zip,
    ->     cust_country,
    ->     cust_contact,
    ->     cust_email)
    -> VALUES('Pep E. LaPew',
    ->     '100 Main Street',
    ->     'Los Angeles',
    ->     'CA',
    ->     '90046',
    ->     'USA',
    ->     NULL,
    ->     NULL);
Query OK, 1 row affected (0.01 sec)

此语句与上个例子功能相同,但在表名后明确的给出了列名。在插入行时,MySQL将用VALUES中的值按指定的列次序插入。

因为提供了列名,VALUES必须按指定的次序匹配值,而不一定要按表中的定义顺序匹配。这样即使表的结构改变,此语句也能正常工作。没有值的列可以忽略(允许NULL)。

改变次序,简化的语句:

mysql> INSERT INTO customers(cust_name,
    ->     cust_address,
    ->     cust_city,
    ->     cust_state,
    ->     cust_zip,
    ->     cust_country)
    -> VALUES('Pep E. LaPew',
    ->     '100 Main Street',
    ->     'Los Angeles',
    ->     'CA',
    ->     '90046',
    ->     'USA');
Query OK, 1 row affected (0.01 sec)
  • 总是使用列的列表 使用INSERT时,应该总是指定列的次序,尽管比较烦琐,但能保证安全和代码可用。

  • 仔细值给出值 不管使用哪种语法,都必须给出VALUES的正确数目。不提供列次序,则按表定义次序提供每个列的值。提供列次序,则按提供的列次序提供每个列的值。

  • 省略列 如果表的定义允许,则可以在INSERT操作中省略某些列。
    省略列的条件:

    • 该列定义为允许NULL值(无值或空值)。
    • 表定义中给出了默认值。

    如果对表中不允许NULL值且没有默认值的列不给出值,则会报错。

  • 提高整体性能 INSERT操作可能很耗时,它可能降低等待处理的SELECT语句的性能。
    如果数据检索更为重要,可以在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的执行优先级:

    INSERT LOW_PRIORITY INTO
    

插入多个行

为了插入多个行,我们需要将每行一条一条插入。或者,当每条INSERT语句给出的列次序相同,可以组合各语句:

mysql> INSERT INTO customers(cust_name,
    ->     cust_address,
    ->     cust_city,
    ->     cust_state,
    ->     cust_zip,
    ->     cust_country)
    -> VALUES(
    ->        'Pep E. LaPew',
    ->        '100 Main Street',
    ->        'Los Angeles',
    ->        'CA',
    ->        '90046',
    ->        'USA'
    ->       ),
    ->       (
    ->        'M. Martian',
    ->        '42 Galaxy Way',
    ->        'New York',
    ->        'NY',
    ->        '11213',
    ->        'USA'
    -> );
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

其中单条INSERT语句有多组值,每组值用一对圆括号括起,用逗号分隔。

  • 提高INSERT的性能 MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句快。

插入检索出的数据

INSERT一般用来给表插入一个指定列值的行。但INSERT还存在另一种形式INSERT SELECT,可以将一条SELECT语句的结果插入表中。它由一条INSERT语句和一条SELECT语句组成。

从另一表中合并客户列表到customers表。

INSERT INTO customers(
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country)
SELECT
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
FROM custnew;

custnew表说明 该表不存在于数据库中,如果想要尝试此语句。必须先在库中创建一个名为custnew的表,其结构和定义与customers表一致,并且需要自行填充数据。

这个例子使用INSERT SELECT从custnew中将所有数据导入customers表。SELECT中列出的每个列对应customers表名后列出的表次序。

  • INSERT SELECT中的列名 为了简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但不一定要求列名匹配,只需对应位置的类型相同就合法。

INSERT SELECT中SELECT语句也可包含WHERE子句以过滤插入的数据。

你可能感兴趣的:(MySQL必知必会,mysql,数据库,sql,database,数据库开发)