上文我们介绍了GPDB的常用管理操作,今天我们来说下它的增删改查。这是对于一个数据库最基本的功能了,然而GPDB有它自己的特性,我们一起来看下。
插入数据
按列插入数据:
gptest=# create table products (name varchar(20),price numeric(10,2),product_no bigint) distributed by (product_no);
CREATE TABLE
gptest=# INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);
INSERT 0 1
gptest=# select * from products;
name | price | product_no
--------+-------+------------
Cheese | 9.99 | 1
(1 row)
同事插入多列:
gptest=# INSERT INTO products (product_no, name, price) VALUES
gptest-# (1, 'Cheese', 9.99),
gptest-# (2, 'Bread', 1.99),
gptest-# (3, 'Milk', 2.99);
INSERT 0 3
gptest=# select * from products; name | price | product_no
--------+-------+------------
Cheese | 9.99 | 1
Cheese | 9.99 | 1
Bread | 1.99 | 2
Milk | 2.99 | 3
(4 rows)
我们看到了GPDB插入数据和普通数据库一样,那么是否可以像传统的DBMS一样用作OLTP系统呢。不是的!GPDB官方文档指出对于append表最大127个并发实务操作,所以你不能把它用作生产业务系统数据库,对于高并发并不合适!对于频繁的数据插入操作,我们通常不用insert操作,用copy命令,后面我们会介绍。
更新数据
gptest=# UPDATE products SET price = 10 WHERE price = 9.99;
UPDATE 2
gptest=# select * from products;
name | price | product_no
--------+-------+------------
Bread | 1.99 | 2
Cheese | 10.00 | 1
Cheese | 10.00 | 1
Milk | 2.99 | 3
(4 rows)
删除数据
gptest=# DELETE FROM products WHERE price = 10;
DELETE 2
gptest=# select * from products;
name | price | product_no
-------+-------+------------
Milk | 2.99 | 3
Bread | 1.99 | 2
(2 rows)
清空表数据
gptest=# truncate table products;
TRUNCATE TABLE
gptest=# select * from products;
name | price | product_no
------+-------+------------
(0 rows)
GPDB的删除和更新操作,并不是直接物理删除数据,而是对数据打了一个标志,select查询的时候看不到而已,GPDB会定时自动清空这些数据,回收空间。当然你也可以手动运行VACUUM 命令来手动回收空间。
VACUUM products
删除数据后,最好运行一下VACUUM,对于大表,不要轻易做VACUUM!