一、表的定义:
对于任何一种关系型数据库而言,表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。
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中文文档,如转载本系列博客,请同样注明该出处。
本文向大家介绍PostgreSQL copy 命令教程详解,包括了PostgreSQL copy 命令教程详解的使用技巧和注意事项,需要的朋友参考一下 报文介绍PostgreSQL copy 命令,通过示例展示把查询结果导出到csv文件,导入数据文件至postgresql。 1. copy命令介绍 copy命令用于在postgreSql表和标准文件系统直接传输数据。copy命令让PostgreSQ
本文向大家介绍PostgreSQL教程(三):表的继承和分区表详解,包括了PostgreSQL教程(三):表的继承和分区表详解的使用技巧和注意事项,需要的朋友参考一下 一、表的继承: 这个概念对于很多已经熟悉其他数据库编程的开发人员而言会多少有些陌生,然而它的实现方式和设计原理却是简单易懂,现在就让我们从一个简单的例子开始吧。 1. 第一个继承表: capitals表继
本文向大家介绍PostgreSQL教程(二):模式Schema详解,包括了PostgreSQL教程(二):模式Schema详解的使用技巧和注意事项,需要的朋友参考一下 一个数据库包含一个或多个命名的模式,模式又包含表。模式还包含其它命名的对象,包括数据类型、函数,以及操作符。同一个对象名可以在不同的模式里使用而不会导致冲突; 比如,schema1和myschema都可以包含叫做mytable的表。
主要内容:什么是数据库?,ORDBMS 术语,PostgreSQL 特征,相关资源PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。 PostgreSQL 开发者把它念作 post-gress-Q-L。 PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库"。 参考内容:PostgreSQL 10.1 手册 什么是数据库? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 每个数据
本文向大家介绍python连接PostgreSQL数据库的过程详解,包括了python连接PostgreSQL数据库的过程详解的使用技巧和注意事项,需要的朋友参考一下 1. 常用模块 # 连接数据库 connect()函数创建一个新的数据库连接对话并返回一个新的连接实例对象 # 打开一个操作整个数据库的光标 连接对象可以创建光标用来执行SQL语句 # 执行一个创建表的SQL语句 光标可以使用exe
本文向大家介绍Bootstrap表单组件教程详解,包括了Bootstrap表单组件教程详解的使用技巧和注意事项,需要的朋友参考一下 表单常见的元素主要包括:文本输入框、下拉选择框、单选框、复选框、文本域、按钮等。下面是不同的bootstrap版本: LESS: forms.less SASS: _forms.scss bootstrap仅对表单内的fieldset、legend、label标签进行