SQL

SQL 知识量:22 - 44 - 129

15.1 数据插入><

插入完整的行- 15.1.1 -

数据表创建完成后,需要将数据插入表中。SQL使用insert关键字来实现数据插入。有以下几种方式:

  • 插入完整的行。

  • 插入行的一部分。

  • 插入某些查询的结果。

要插入完整的行,需要事先知道表的结构,即所有的表列名称。

例如:有一个产品表(product)的信息如下:

+----+--------------+--------------+
| id | product_name | produce_date |
+----+--------------+--------------+
|  1 | tea          | 2013-05-08   |
|  2 | coffee       | 2011-02-07   |
|  3 | computer     | 2012-04-26   |
|  4 | TV           | 2014-10-18   |
|  5 | phone        | 2013-05-01   |
|  6 | desk         | 2015-08-10   |
|  7 | bed          | 2012-02-15   |
+----+--------------+--------------+

现在,使用insert插入一条新的信息。

insert into product values(8,'ball','2011-05-05');

插入成功后,表变为:

+----+--------------+--------------+
| id | product_name | produce_date |
+----+--------------+--------------+
|  1 | tea          | 2013-05-08   |
|  2 | coffee       | 2011-02-07   |
|  3 | computer     | 2012-04-26   |
|  4 | TV           | 2014-10-18   |
|  5 | phone        | 2013-05-01   |
|  6 | desk         | 2015-08-10   |
|  7 | bed          | 2012-02-15   |
|  8 | ball         | 2011-05-05   |
+----+--------------+--------------+

在上面的insert语句中,没有给出表的列名,这时必须给表的每一列都提供一个值。这样的操作严重依赖表列的默认次序,如果表列次序发生变化,插入将会失败。因此,这样的insert语句是不安全的,推荐在插入时总是给出明确的列名。修改后的语句如下:

insert into product(id,
                    product_name,
                    produce_date) 
values(9,
       'pen',
       '2014-09-05');

插入成功后,表变为:

+----+--------------+--------------+
| id | product_name | produce_date |
+----+--------------+--------------+
|  1 | tea          | 2013-05-08   |
|  2 | coffee       | 2011-02-07   |
|  3 | computer     | 2012-04-26   |
|  4 | TV           | 2014-10-18   |
|  5 | phone        | 2013-05-01   |
|  6 | desk         | 2015-08-10   |
|  7 | bed          | 2012-02-15   |
|  8 | ball         | 2011-05-05   |
|  9 | pen          | 2014-09-05   |
+----+--------------+--------------+

插入部分行- 15.1.2 -

有时,对于一行信息,不需要对每列都插入数据,可能只需要插入某一列或几列的数据。这时,只需要对给出列名的提供插入值即可。

例如:向产品表中添加“milk”,只给出名称,时间使用当前日期。

insert into product(product_name,produce_date) values('milk',curdate());

插入成功后,表变为:

+----+--------------+--------------+
| id | product_name | produce_date |
+----+--------------+--------------+
|  1 | tea          | 2013-05-08   |
|  2 | coffee       | 2011-02-07   |
|  3 | computer     | 2012-04-26   |
|  4 | TV           | 2014-10-18   |
|  5 | phone        | 2013-05-01   |
|  6 | desk         | 2015-08-10   |
|  7 | bed          | 2012-02-15   |
|  8 | ball         | 2011-05-05   |
|  9 | pen          | 2014-09-05   |
| 10 | milk         | 2015-05-29   |
+----+--------------+--------------+

以上SQL语句中没有给出id列名和其插入值,DBMS对没有给出插入值的id列自动赋值。(当然,这取决于表的定义情况。)

对于省略值的列,必须满足以下条件之一:

  • 该列定义为允许为NULL值(无值或空值)。

  • 在表定义中给出默认值。如果插入时没有给出,将使用默认值。

  • 一般主键定义为自增值,将由DBMS自动赋值(上面示例即是如此)。

插入检索出的数据- 15.1.3 -

可以利用insert语句将由select语句查询的数据插入表中,也就是insert select语句。

例如:people表的信息如下:

+----+----------+---------+--------+
| id | realName | realAge | sex    |
+----+----------+---------+--------+
|  1 | Susan    |      12 | female |
|  2 | Jame     |      12 | male   |
|  3 | Bob      |      12 | male   |
|  4 | Robot    |      12 | male   |
|  5 | Jen      |      12 | female |
|  6 | Toney    |      12 | male   |
|  8 | Alice    |      12 | female |
|  9 | Bonnie   |      12 | male   |
| 10 | Ella     |      12 | female |
+----+----------+---------+--------+

man表的信息如下:

+----+-------+------+------+
| id | name  | age  | sex  |
+----+-------+------+------+
|  1 | Bill  |   15 | male |
|  2 | Limon |   14 | male |
|  3 | Soen  |   16 | male |
+----+-------+------+------+

将man表的信息插入people表中,SQL语句为:

insert into people(realName,realAge,sex) 
select name,age,sex from man;

插入后的people表为:

+----+----------+---------+--------+
| id | realName | realAge | sex    |
+----+----------+---------+--------+
|  1 | Susan    |      12 | female |
|  2 | Jame     |      12 | male   |
|  3 | Bob      |      12 | male   |
|  4 | Robot    |      12 | male   |
|  5 | Jen      |      12 | female |
|  6 | Toney    |      12 | male   |
|  8 | Alice    |      12 | female |
|  9 | Bonnie   |      12 | male   |
| 10 | Ella     |      12 | female |
| 11 | Bill     |      15 | male   |
| 12 | Limon    |      14 | male   |
| 13 | Soen     |      16 | male   |
+----+----------+---------+--------+

从上面的示例可以看出,即使两个表的列名不同,只要数据类型是兼容的,插入就会成功,insert语句是根据列的位置来完成插入操作的。