第15课 插入数据
这一课介绍如何将行插入到数据库表中。我们学习了使用INSERT
的几种方式。为什么要明确使用列名,如何用INSERT SELECT
从其他表中导入行,如何用SELECT INFO
将行导出到一个新表。
15.1 数据插入
INSERT
用来将行插入(或添加)到数据库表中,插入有几种方式:
- 插入完整的行
- 插入行的一部分
- 插入某些查询的结果
提示:插入及系统安全
使用
INSERT
语句可能需要客户端/服务器DBMS
中的特定安全权限。在你试图使用INSERT
前,应该保证自己有足够的安全权限。
15.1.1 插入完整的行
语句中须在表名后的括号里明确给出列名。在插入行时,DBMS
将用VALUES
列表中的相应值填入列表中的对应项。
优点是:即使表的结构改变,这条INSERT
语句仍然能正确工作。
15.1.2 插入部分行
注意:省略列
如果表的定义允许,则可以在
INSERT
操作中省略某些列。省略的列必须满足以下某个条件。
- 该列定义为允许
NULL值
(无值或空值)。- 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
注意:省略所需的值
如果表中不允许有
NULL
值或者默认值,这时却省略了表中的值,DBMS
就会产生错误消息,相应的行不能成功插入。
15.1.3 插入检索出的数据
可以利用它将SELECT
语句的结果插入表中,这就是所谓的INSERT SELECT
。顾名思义,它是由一条INSERT
语句和一条SELECT
语句组成的。
提示:
INSERT SELECT
中的列名为简单起见,这个例子在
INSERT
和SELECT
语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS
一点儿也不关心SELECT
返回的列名。它使用的是列的位置,因此SELECT
中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。
INSERT SELECT
中SELECT
语句可以包含WHERE
子句,以过滤插入的数据。
提示:插入多行
INSERT
通常只插入一行。要插入多行,必须执行多个INSERT
语句。INSERT SELECT
是个例外,它可以用一条INSERT插入多行,不管SELECT
语句返回多少行,都将被INSERT
插入。
15.2 从一个表复制到另一个表
有一种数据插入不使用INSERT
语句。要将一个表的内容复制到一个全新的表(运行中创建的表),可以使用SELECT INFO
语句。
与INSERT SELECT
将数据添加到一个已经存在的表不同,SELECT INTO
将数据复制到一个新表(有的DBMS
可以覆盖已经存在的表,这依赖于所使用的具体DBMS)。
说明:
INSERT SELECT与SELECT INTO
它们之间的一个重要差别是前者插入数据,而后者导出数据。
在使用SELECT INTO
时,需要知道一些事情:
- 任何
SELECT
选项和子句都可以使用,包括WHERE
和GROUP BY
; - 可利用联结从多个表插入数据;
- 不管从多少个表中检索数据,数据都只能插入到一个表中。
提示:进行表的复制
SELECT INTO
是试验新SQL
语句前进行表复制的很好工具。先进行复制,可在复制的数据上测试SQL
代码,而不会影响实际的数据。