11. 插入数据

本节使用的表

customers

postgres=# \d customers

                    Table "public.customers"
    Column    |      Type      | Collation | Nullable | Default
--------------+----------------+-----------+----------+---------
 cust_id      | character(10)  |           | not null |
 cust_name    | character(50)  |           | not null |
 cust_address | character(50)  |           |          |
 cust_city    | character(50)  |           |          |
 cust_state   | character(5)   |           |          |
 cust_zip     | character(10)  |           |          |
 cust_country | character(50)  |           |          |
 cust_contact | character(50)  |           |          |
 cust_email   | character(255) |           |          |
Indexes:
    "customers_pkey" PRIMARY KEY, btree (cust_id)
Referenced by:
    TABLE "orders" CONSTRAINT "fk_orders_customers" FOREIGN KEY (cust_id) REFERENCES customers(cust_id)
SELECT
    *
FROM
    customers;

 cust_id    | cust_name     | cust_address         | cust_city | cust_state | cust_zip | cust_country | cust_contact
   | cust_email
------------+---------------+----------------------+-----------+------------+----------+--------------+--------------------
---+----------------------------
 1000000001 | Village Toys  | 200 Maple Lane       | Detroit   | MI         | 44444    | USA          | John Smith
   | sales@villagetoys.com
 1000000002 | Kids Place    | 333 South Lake Drive | Columbus  | OH         | 43333    | USA          | Michelle Green
   |
 1000000003 | Fun4All       | 1 Sunny Place        | Muncie    | IN         | 42222    | USA          | Jim Jones
   | jjones@fun4all.com
 1000000004 | Fun4All       | 829 Riverside Drive  | Phoenix   | AZ         | 88888    | USA          | Denise L. Stephens
   | dstephens@fun4all.com
 1000000005 | The Toy Store | 4545 53rd Street     | Chicago   | IL         | 54545    | USA          | Kim Howard
   |
(5 rows)

数据插入

插入有几种方式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入某些查询的结果。

插入完整的行

INSERT INTO customers
VALUES
    (
        '1000000006', 
        'Toy Land', 
        '123 Any Street', 
        'New York', 
        'NY'  , 
        '11111', 
        'USA', 
        NULL, 
        NULL
    );
SELECT
    *
FROM
    customers
WHERE
    cust_id = '1000000006';

 cust_id    | cust_name | cust_address   | cust_city | cust_state | cust_zip
   | cust_country | cust_contact | cust_email
------------+-----------+----------------+-----------+------------+-------------
---+--------------+--------------+-------------------
 1000000006 | Toy Land  | 123 Any Street | New York  | NY         | 11111   
   | USA          |              |
(1 row)

存储到表中每一列的数据在VALUES子句中给出,必须给每一列提供一个值。如果某列没有值,则应该使用NULL值(假定表允许对该列指定空值)。各列必须以它们在表定义中出现的次序填充。

虽然这种语法很简单,但并不安全,应该尽量避免使用。这种语法高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。

更安全的方法如下:

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语法,VALUES的数目都必须正确。如果提供列名,则必须给列出的每个列一个值。

插入部分行

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

  • 该列定义为允许NULL值(无值或空值);
  • 在表定义中给出默认值。
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'
    );

插入检索出的数据

INSERT INTO customers (
    cust_id,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
)
SELECT
    cust_id,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
FROM
    custnew;

为简单起见,在INSERTSELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS并不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列。

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

INSERT通常只插入一行。INSERT SELECT是个例外,它可以用一条INSERT插入多行。

从一个表复制到另一个表

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

INSERT SELECT将数据添加到一个已经存在的表,SELECT INTO将数据复制到一个新表(有的DBMS可以覆盖已经存在的表)。

SELECT
    *
INTO
    custcopy
FROM
    customers;

PostgreSQL还可以使用:

CREATE TABLE custcopy AS
SELECT
    * 
FROM
    customers;

因为这里使用的是*,所以将在custcopy表中创建(并填充)与customers表的每一列相同的列。要想只复制部分的列,可以明确给出列名。

在使用SELECT INTO时,需要知道:

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

SELECT INTO是试验新SQL语句前进行表复制的很好工具。先进行复制,然后在复制的数据上测试SQL代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值