数据插入

  • INSERT是用来插入(或添加)行到数据库表的。

    插入可以用以下几种方式使用:

    1. 插入完整的行;
    2. 插入行的一部分;
    3. 插入多行;
    4. 插入某些查询的结果。
  • 插入及系统安全:可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句。

插入完整的行

1
2
3
4
5
6
7
8
9
10
INSERT INTO customers
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);
  • 没有输出:INSERT语句一般不会产生输出。

  • MySQL自动增量:你不想给出一个值(这是MySQL的工作),又不能省略此列(必须给出每个列),所以指定一个NULL值(它被MySQL忽略,MySQL在这里插入下一个可用的cust_id值)。

  • 虽然上述语法简单,但不安全。

    编写INSERT语句的更安全(不过更繁琐)的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);

-- 即使表的结构改变,此INSERT语句仍然能正确工作
-- cust_id的NULL值是不必要的,cust_id列并没有出现在列表中,所以不需要任何值
  • 总是使用列的列表:使用列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。

  • 省略列:省略列必须满足以下条件:

    1. 该列定义为允许NULL值(无值或空值);
    2. 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
  • 提高整体性能:INSERT操作在很多索引需要更新时可能很耗时,而且可能降低等待处理的SELECT语句的性能。

    如果数据检索是最重要的(通常是这样),则可以通过在INSERTINTO之间添加关键字LOW_PRIORITYINSERT LOW_PRIORITY INTO),指示MySQL降低INSERT语句的优先级。

    此关键字也适用于UPDATEDELETE语句。

插入多个行

  • INSERT可以插入一行到一个表中。

    插入多个行可以使用多条INSERT语句,甚至一次提交他们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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. Martian',
'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. Martian',
'42 Galaxy Way',
'New York',
'NY',
'11213',
'USA'
);
  • 提高INSERT的性能:此技术可以提高数据库处理的性能,因为MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句快。

插入检索出的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 使用INSERT SELECT从custnew中将所有数据导入customers
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;

/*
此例子导入了cust_id(假如你能够确保cust_id的值不重复)。
你也可以简单的省略这列(从INSERT和SELECT中),这样MySQL就会生成新值。
*/
  • INSERT SELECT中的列名:INSERTSELECT语句不一定要求列名匹配。

    MySQL不关心SELECT返回的列名,它使用的是列的位置。

    SELECT中的第一列(不管其列名)将用来填充表列中指定的第一个列,第二列填充表列中指定的第二个列,如此等等。

    这对于从使用不同列名的表中导入数据是非常有用的。

  • INSERT SELECTSELECT语句可包含WHERE子句以过滤插入的数据。

  • 更多例子:如果想看INSERT用法的更多例子,请参阅附录B中给出的样例表填充脚本。