目录

1、数据插入

1.1、插入完整的行

1.2 、插入部分行

1.3、插入检索出的数据

2、从一个表复制到另一个表


如何利用SQL的INSERT语句将数据插入表中。

1、数据插入

INSERT用来将行插入(或添加)到数据库表。插入有几种方式:

  1. 插入完整的行;
  2. 插入行的一部分;
  3. 插入某些查询的结果。

提示:插入及系统安全

使用INSERT语句可能需要客户端/服务器DBMS中的特定安全权限。在你试图使用INSERT前,应该保证自己有足够的安全权限。

1.1、插入完整的行

把数据插入表中的最简单方法是使用基本的INSERT语法,它要求指定表名和插入到新行中的值。下面举一个例子:

输入:

INSERT INTO Customers
VALUES
('1000000006',  'Toy Land',  '123 Any Street',  'New York',  'NY',  '11111',  'USA',  NULL,  NULL); 

这个例子将一个新顾客插入到Customers表中。存储到表中每一列的数据在VALUES子句中给出,必须给每一列提供一个值。如果某列没有值,如上面的cust_contact和cust_email列,则应该使用NULL值(假定表允许对该列指定空值)。各列必须以它们在表定义中出现的次序填充。

提示:INTO关键字

在某些SQL实现中,跟在INSERT之后的INTO关键字是可选的。但是,即使不一定需要,最好还是提供这个关键字,这样做将保证SQL代码在DBMS之间可移植。

虽然这种语法很简单,但并不安全,应该尽量避免使用。上面的SQL语句高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安全的,这样做迟早会出问题。

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

输入:

INSERT INTO Customers
(cust_id,  cust_name,  cust_address,  cust_city,  cust_state,  cust_zip,  cust_country,  cust_contact,  cust_email) 
VALUES
('1000000006',  'Toy Land',  '123 Any Street',  'New York',  'NY',  '11111',  'USA',  NULL,  NULL); 

这个例子与前一个INSERT语句的工作完全相同,但在表名后的括号里明确给出了列名。在插入行时,DBMS将用VALUES列表中的相应值填入列表中的对应项。VALUES中的第一个值对应于第一个指定列名,第二个值对应于第二个列名,如此等等。

因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序。其优点是,即使表的结构改变,这条INSERT语句仍然能正确工作。

下面的INSERT语句填充所有列(与前面的一样),但以一种不同的次序填充。因为给出了列名,所以插入结果仍然正确:

INSERT INTO Customers
(cust_id,  cust_contact,  cust_email,  cust_name,  cust_address,  cust_city,  cust_state,  cust_zip) 
VALUES
('1000000006',  NULL,  NULL,  'Toy Land',  '123 Any Street',  'New York',  'NY',  '11111'); 

提示:总是使用列的列表

不要使用没有明确给出列的INSERT语句。给出列能使SQL代码继续发挥作用,即使表结构发生了变化。

注意:小心使用VALUES 

不管使用哪种INSERT语法,VALUES的数目都必须正确。如果不提供列名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入

1.2 、插入部分行

正如所述,使用INSERT的推荐方法是明确给出表的列名。使用这种语法,还可以省略列,这表示可以只给某些列提供值,给其他列不提供值。

请看下面的例子:

输入:

INSERT INTO Customers
(cust_id,  cust_name,  cust_address,  cust_city,  cust_state,  cust_zip,  cust_country)
VALUES
('1000000006',  'Toy Land',  '123 Any Street',  'New York',  'NY',  '11111',  'USA');

没有给cust_contact和cust_email这两列提供值。这表示没必要在INSERT语句中包含它们。因此,这里的INSERT语句省略了这两列及其对应的值。

注意:省略列

如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。

  1. 该列定义为允许NULL值(无值或空值)。
  2. 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

注意:省略所需的值 

如果表中不允许有NULL值或者默认值,这时却省略了表中的值,DBMS就会产生错误消息,相应的行不能成功插入。

1.3、插入检索出的数据

INSERT一般用来给表插入具有指定列值的行。INSERT还存在另一种形式,可以利用它将SELECT语句的结果插入表中,这就是所谓的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; 

说明:新例子的说明

这个例子从一个名为CustNew的表中读出数据并插入到Customers表。为了试验这个例子,应该首先创建和填充CustNew表。CustNew表的结构与Customers表相同。在填充CustNew时,不应该使用已经在Customers中用过的cust_id值(如果主键值重复,后续的INSERT操作将会失败)。

这个例子使用INSERT SELECT从CustNew中将所有数据导入Customers。SELECT语句从CustNew检索出要插入的值,而不是列出它们。SELECT中列出的每一列对应于Customers表名后所跟的每一列。这条语句将插入多少行呢?这依赖于CustNew表有多少行。如果这个表为空,则没有行被插入(也不产生错误,因为操作仍然是合法的)。如果这个表确实有数据,则所有数据将被插入到Customers。

提示:INSERT SELECT中的列名

为简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS一点儿也不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。 

INSERT SELECT中SELECT语句可以包含WHERE子句,以过滤插入的数据。

提示:插入多行

INSERT通常只插入一行。要插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。 

2、从一个表复制到另一个表

有一种数据插入不使用INSERT语句。要将一个表的内容复制到一个全新的表(运行中创建的表),可以使用SELECT INTO语句。

说明:DB2不支持

DB2不支持这里描述的SELECT INTO。

 与INSERT SELECT将数据添加到一个已经存在的表不同,SELECT INTO将数据复制到一个新表(有的DBMS可以覆盖已经存在的表,这依赖于所使用的具体DBMS)。

说明:INSERT SELECT与SELECT INTO

它们之间的一个重要差别是前者导出数据,而后者导入数据。

下面的例子说明如何使用SELECT INTO:

输入:

SELECT * INTO CustCopy FROM Customers; 

这条SELECT语句创建一个名为CustCopy的新表,并把Customers表的整个内容复制到新表中。因为这里使用的是SELECT *,所以将在CustCopy表中创建(并填充)与Customers表的每一列相同的列。要想只复制部分的列,可以明确给出列名,而不是使用*通配符。

MariaDB、MySQL、Oracle、PostgreSQL和SQLite使用的语法稍有不同:

CREATE TABLE CustCopy AS SELECT * FROM Customers; 

在使用SELECT INTO时,需要知道一些事情:

  1. 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY;
  2. 可利用联结从多个表插入数据;
  3. 不管从多少个表中检索数据,数据都只能插入到一个表中。

提示:进行表的复制

SELECT INTO是试验新SQL语句前进行表复制的很好工具。先进行复制,可在复制的数据上测试SQL代码,而不会影响实际的数据。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐