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表中有多少行。如果这个表为空,则没有行被插入。