pg支持大部分的sql标准和现代特性:复杂查询、外键、触发器、可更新的视图、完整的事务、多版本并发控制
同时pg可以通过多种方式的用户扩展,如添加新的:数据类型、功能、操作、聚合函数、索引方法、过程语言
公约
[]:可选部分
{} and | :必须选择其中的一个
… :前面元素可以重复
基本架构
pg使用cs模型(TCP/IP),一个pg session由下面程序组成:
一个服务器进程:管理数据库文件,接受来自客户端应用程序与数据库的连接,代理客户端执 行数据库操作
需要执行数据库操作的客户端应用程序,一个客户端可以是一个文本工具,图形应用,能够访 问数据库的web应用或一个专门数据维护工具。一些已经由pg提供,大部分需要用户开 发
pg服务能够处理客户端多个并发连接,为每一个连接fork一个新的进程,主服务总是运行,等待 客户端的连接
高级特性
视图
某些数据组合是系统特别敏感,你不想每次需要时执行查询,可以创建在查询视图,该视图的操作类似一个普通表
CREATE VIEW myview AS SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name; SELECT * FROM myview;
使用视图是具有良好数据设计的一个重要方面
外键
维护数据的完整性。一些简单数据库系统通过首先查询关联表检查记录是否存在,然后插入or拒绝新记录,这种方法有一些问题,很不方便。因此pg能为你做这些:
CREATE TABLE cities ( city varchar(80) primary key, location point ); CREATE TABLE weather ( city varchar(80) references cities(city), temp_lo int, temp_hi int, prcp real, date date );
此时插入cities中未存在的weather时,pg出现错误提示
事务
是所有数据库系统的一个基本概念,重要一点:将多个步聚绑定位单一,all-or-nothing操作。
步聚之间的中间状态在其他事务是不可见。如果步聚出现故障,防止事务的完成,随后的步聚将不会影响。一个事务认为是原子的。事务另一特性:原子更新是密切相关,当多个事务并发的运行,每一个事务不会看到其他事务不完整的改变。
在pg中事务通过begin和commit实现:
begin; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; -- etc etc COMMIT;
如不想提交,可使用rollback代替commit,所有的更新将取消。
pg实际上将每一个sql语句块当做一个事务内执行,当你不指定begin时,每个sql都隐含包裹begin和commit块
可以通过使用savepoints更加精确的方式控制事务中的语句,savepoints容许你有选择的丢弃事务的部分,而提交剩余的。如需要回滚到savepoints使用 rollback to。释放or回滚到savepoints会自动释放该savepoints后定义的所有savepoints。这些都发生在事务内部,所以不能被其他数据库session所见。如你提交了事务,那么这个提交当做一个单位被其他session可见,而回滚则从未可见
继承
面向对象数据库的概念,打开数据库新的特性
PostgreSql基本数据类型
数值类型
Name | Storage Size | Desc | Range |
smallint | 2byte | Small-range integer | -32768~+32767 |
integer | 4byte | Typical choice integer | -2147483648~+ 2147483647 |
bigint | 8byte | Large-range integer | -9223372036854775808~+9223372036854775807 |
decimal | variable | User-specified precision,exact | 小数点前131072位,后16383位 |
numeric | variable | User-specified precision,exact | 小数点前131072位,后16383位 |
real | 4byte | Variable precision,inexact | 6位精度 |
double precision | 8byte | Variable precision,inexact | 15位精度 |
smallserial | 2byte | Small autoincrementing integer | 1~32767 |
serial | 4byte | autoincrementing integer | 1~2147483647 |
bigserial | 8byte | Large autoincrementing integer | 1~9223372036854775807 |
numeric(precision, scale) 精度位最大precision位,小数部分最大为 scale位
numeric(precision) precision为正数,scale为0
numeric 不使用precision,scale ,该数字将使用任意精度存储,到精度的限制
货币类型
存储一个固定小数精度的货币值,小数精度是由数据库的lc_monetary设置
Name | Storage Size | Desc | Range |
money | 8byte | Currency amount | -92233720368547758.08~92233720368547758.07 |
字符类型
Name | Desc |
character varying(n), varchar(n) | 限制可变长度 |
character(n), char(n) | 固定长度,空白填充 |
text | 可变长度不限 |
二进制类型
是一个八位的位组(字节)
Name | Storage Size | Desc |
bytea | 1or4字节加上实际二进制字符串 | 变长的二进制字串 |
日期/时间类型
Name | Stor Size | Desc | Low value | High value | Resolution |
timestamp[(p)] [without time zone] | 8bytes | 包含日期和时间(没有时区) | 4713BC | 294276AD | 1微秒/14位 |
timestamp[(p)] [with time zone] | 8bytes | 包含日期和时间,使用时区 | 4713BC | 294276AD | 1微秒/14位 |
date | 4bytes | 日期,无时间 | 4713BC | 5874897AD | 1天 |
time[(p)] [without time zone] | 8bytes | 时间,无日期 | 00:00:00 | 24:00:00 | 1微秒/14位 |
time[(p)] [with time zone] | 12bytes | 只有时间,使用时区 | 00:00:00+1459 | 24:00:00-1459 | 1微秒/14位 |
interval[fields] [(p)] | 12bytes | 时间间隔 | -178000000 years | 178000000 years | 1微秒/14位 |
布尔类型
Name | Stor Size | Desc |
boolean | 1byte | true/false/unknown(NULL) |