插入数据
Posted 霖行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入数据相关的知识,希望对你有一定的参考价值。
插入数据
本章介绍如何利用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子句以过滤插入的数据。
以上是关于插入数据的主要内容,如果未能解决你的问题,请参考以下文章