17 插入数据

17.1 数据插入

  • 顾名思义,INSERT是用来插入行到数据库表的。插入可以用几种方式使用:
    • 插入完整的行
    • 插入行的一部分
    • 插入多行
    • 插入某些查询的结果
  • 插入及系统安全 可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句。

17.2 插入完整的行

  • 把数据插入表中的最简单的方法是使用基本的INSERT语法,它要求指定表名和被插入到新行中的值。下面举一个例 子:
insert into Customers
value(NULL, 
    'Pep E. LaPew',
    '100 Main Street',
    'Los Angeles',
    'CA',
    '90046',
    'USA',
    NULL,
    NULL
);
  • 存储到每个表列中的数据在values子句中给出,对每个列必须提供一个值。如果某个列没有值,应该使用NULL值。
  • 虽然这种语法很简单,但并不安全,应该尽量避免使用。
  • 编写INSERT语句的更安全的方法如下:
insert into Customers(cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country,
    cust_contact,
    cust_email)
  value(
    'Pep E. LaPew',
    '100 Main Street',
    'Los Angeles',
    'CA',
    '90046',
    'USA',
    NULL,
    NULL
);
  • 因为提供了列名,values必须以其指定的次序匹配指定的列名,不一定按各个列出现在实际表中的次序。其优 点是,即使表的结构改变,此insert语句仍然能正确工作。你会发现cust_id的NULL值是不必要的,cust_id列并没有出现在列表中,所以不需要任何值。
  • 下面的insert语句填充所有列,但以一种不同的次序填充。因为给出了列名,所以插入结果仍然正确:
insert into customers(cust_name,
        cust_contact,
        cust_email,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
        )
        values('Pep E. LaPew',
            NULL,
            NULL,
            '100 Main Street',
            'Los Angeles',
            'CA',
            '90046',
            'USA',
        );
  • 总是使用列的列表 一般不要使用没有明确给出列的列表的INSERT语句。使用 列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。
  • 仔细地给出值 不管使用哪种INSERT语法,都必须给出values的正确数目。如果不提供列名,则必须给每个表列提供一个值。如果提供列名,则必须对每个列出的列给出一个值,如果不这样,将产生一个错误信息,相应的行插入不成功。
  • 省略列 如果表的定义允许,则可以在insert操作中省略某些列。省略的列必须满足以下某个条件。
    • 该列定义为允许NULL值(无值或空值)
    • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
  • 提高整体性能 数据库经常被多个客户访问,对处理什么请求以及用什么 次序处理进行管理是MySQL的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的select语句的性能。
  • 如果数据检索是最重要的,则你可以通过在insert和into之间添加关键字low_priority,指示MySQL降低insert语句的优先级,如下所示:
insert low_priority into

顺便说一下,这也适用于下一章介绍的update和delete语句。

17.3 插入多个行

  • insert可以插入一行到一个表中。但如果你想插入多个行怎么办?可以使用多条insert语句,甚至一次提交它 们,每条语句用一个分号结束,如下所示:
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'
    );
 insert into customers(cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
    ) values('M. Martain',
        '42 Galaxy Way',
        'New York',
        'NY',
        '11213',
        'USA'
    );
  • 或者,只要每条insert语句中的列名(和次序)相同,可以如下组合各语句:
 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. Martain',
        '42 Galaxy Way',
        'New York',
        'NY',
        '11213',
        'USA'
    );
  • 其中单条insert语句有多组值,每组值用一对圆括号括起来,用逗号分隔。
  • 提高insert的性能 此技术可以提高数据库处理的性能,因为MySQL用单条insert语句处理多个插入比使用多条insert语句快。

17.4 插入检索出的数据

  • isnert一般用来给表插入一个指定列值得行。但是,insert还存在另一种形式,可以利用它将一条insert语句的结果插入表中。这就是所谓的insert select,顾名思义,它是由一条insert语句和一条select语句组成的。
  • 假如你想从另一个表中合并客户列表到你的customers表。不需要每次读取一行,然后再将它用insert插入,可以如下进行:
 insert into customers(cust_id,
        cust_contact,
        cust_email
        cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
    ) select cust_id,
        cust_contact,
        cust_email
        cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
     from custnew; 
  • 这个例子使用insert select从custnew中将所有数据导入customers。select语句从custnew检索出要插入的值,而不是列出它们。select中列出的每个列对应于customers表名后所跟的列 表中的每个列。这条语句将插入多少行有赖于custnew表中有多少行。如果这个表为空,则没有行被插入。
posted @ 2018-01-14 20:05  _sanjun  阅读(113)  评论(0编辑  收藏  举报