一、表的定义:
对于任何一种关系型数据库而言,表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。
1. 创建表:
CREATE TABLE products ( product_no integer, name text, price numeric );
DROP TABLE products;
CREATE TABLE products ( product_no integer, name text, price numeric DEFAULT 9.99 --DEFAULT是关键字,其后的数值9.99是字段price的默认值。 ); CREATE TABLE products ( product_no SERIAL, --SERIAL类型的字段表示该字段为自增字段,完全等同于Oracle中的Sequence。 name text, price numeric DEFAULT 9.99 );
NOTICE: CREATE TABLE will create implicit sequence "products_product_no_seq" for serial column "products.product_no"
CREATE TABLE products ( product_no integer, name text, --price字段的值必须大于0,否则在插入或修改该字段值是,将引发违规错误。还需要说明的是,该检查约束 --是匿名约束,即在表定义时没有显示命名该约束,这样PostgreSQL将会根据当前的表名、字段名和约束类型, --为该约束自动命名,如:products_price_check。 price numeric CHECK (price > 0) ); CREATE TABLE products ( product_no integer, name text, --该字段的检查约束被显示命名为positive_price。这样做好处在于今后维护该约束时,可以根据该名进行直接操作。 price numeric CONSTRAINT positive_price CHECK (price > 0) );
CREATE TABLE products ( product_no integer NOT NULL, name text NOT NULL, price numeric );
CREATE TABLE products ( product_no integer NOT NULL, name text NOT NULL, price numeric NOT NULL CHECK (price > 0) );
CREATE TABLE products ( product_no integer UNIQUE, name text, price numeric );CREATE TABLE products ( product_no integer, name text, price numeric, UNIQUE (product_no) );
CREATE TABLE example ( a integer, b integer, c integer, UNIQUE (a, c) );
CREATE TABLE products ( product_no integer CONSTRAINT must_be_different UNIQUE, name text, price numeric );
CREATE TABLE products ( product_no integer PRIMARY KEY, --字段product_no被定义为该表的唯一主键。 name text, price numeric );
CREATE TABLE example ( a integer, b integer, c integer, PRIMARY KEY (b, c) );
CREATE TABLE orders ( order_id integer PRIMARY KEY, --该表也可以有自己的主键。 --该表的product_no字段为上面products表主键(product_no)的外键。 product_no integer REFERENCES products(product_no), quantity integer ); CREATE TABLE t1 ( a integer PRIMARY KEY, b integer, c integer, --该外键的字段数量和被引用表中主键的数量必须保持一致。 FOREIGN KEY (b, c) REFERENCES example (b, c) );
CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, shipping_address text ); CREATE TABLE order_items ( product_no integer REFERENCES products ON DELETE RESTRICT, --限制选项 order_id integer REFERENCES orders ON DELETE CASCADE, --级联删除选项 quantity integer, PRIMARY KEY (product_no, order_id) );
二、系统字段:
PostgreSQL的每个数据表中都包含几个隐含定义的系统字段。因此,这些名字不能用于用户定义的字段名。这些系统字段的功能有些类似于Oracle中的rownum和rowid等。
oid: 行的对象标识符(对象ID)。这个字段只有在创建表的时候使用了WITH OIDS,或者是设置了配置参数default_with_oids时出现。这个字段的类型是oid(和字段同名)。
tableoid: 包含本行的表的OID。这个字段对那些从继承层次中选取的查询特别有用,因为如果没有它的话,我们就很难说明一行来自哪个独立的表。tableoid可以和pg_class的oid字段连接起来获取表名字。
xmin: 插入该行版本的事务的标识(事务ID)。
cmin: 在插入事务内部的命令标识(从零开始)。
xmax: 删除事务的标识(事务ID),如果不是被删除的行版本,那么是零。
cmax: 在删除事务内部的命令标识符,或者是零。
ctid: 一个行版本在它所处的表内的物理位置。请注意,尽管ctid可以用于非常快速地定位行版本,但每次VACUUM FULL之后,一个行的ctid都会被更新或者移动。因此ctid是不能作为长期的行标识符的。
OID是32位的量,是在同一个集群内通用的计数器上赋值的。对于一个大型或者长时间使用的数据库,这个计数器是有可能重叠的。因此,假设OID是唯一的是非常错误的,除非你自己采取了措施来保证它们是唯一的。如果你需要标识表中的行,我们强烈建议使用序列号生成器。
三、表的修改:
1. 增加字段:
ALTER TABLE products ADD COLUMN description text;
ALTER TABLE products ADD COLUMN description text CHECK(description <> '');
ALTER TABLE products DROP COLUMN description;
ALTER TABLE products DROP COLUMN description CASCADE;
ALTER TABLE products ADD CHECK(name <> ''); --增加一个表级约束 ALTER TABLE products ADD CONSTRAINT some_name UNIQUE(product_no);--增加命名的唯一性约束。 ALTER TABLE products ADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增加外键约束。 ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; --增加一个非空约束。
ALTER TABLE products DROP CONSTRAINT some_name;
MyTest=# \d products Table "public.products" Column | Type | Modifiers ------------+---------+----------- product_no | integer | name | text | price | numeric | Check constraints: "positive_price" CHECK (price > 0::numeric)
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
ALTER TABLE products ALTER COLUMN price DROP DEFAULT
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
ALTER TABLE products RENAME COLUMN product_no TO product_number;
ALTER TABLE products RENAME TO items;
只有表的所有者才能修改或者删除表的权限。要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令。
需要指出的是,PUBLIC是特殊"用户"可以用于将权限赋予系统中的每一个用户。在声明权限的位置写ALL则将所有的与该对象类型相关的权限都赋予出去。
GRANT UPDATE ON table_name TO user; --将表的更新权限赋予指定的user。 GRANT SELECT ON table_name TO GROUP group; --将表的select权限赋予指定的组。 REVOKE ALL ON table_name FROM PUBLIC; --将表的所有权限从Public撤销。
这里需要特别说明的是,该博客中的大部分案例和段落均取自于PostgreSQL中文文档,如转载本系列博客,请同样注明该出处。