本节使用的表
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;
为简单起见,在INSERT
和SELECT
语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,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
选项和子句都可以使用,包括WHERE
和GROUP BY
; - 可利用联结从多个表插入数据;
- 不管从多少个表中检索数据,数据都只能插入到一个表中。
SELECT INTO
是试验新SQL语句前进行表复制的很好工具。先进行复制,然后在复制的数据上测试SQL代码。