前言
何为PostgreSQL?
PostgreSQL是以加州大学伯克利分校计算 机系开发的 POSTGRES, Version 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。 POSTGRES领先的许多概念只是在非常迟的时候才出现在商业数据库中。
PostgreSQL是最初伯克 利代码的一个开放源码的继承人。它支持大部分 SQL标准并且提供了许多其它现代特性:
- 复杂查询
- 外键
- 触发器
- 视图
- 事务完整性
- 多版本并发控制
另外,PostgreSQL 可以用许多方法进行扩展,比如通过增加新的:
- 数据类型
- 函数
- 操作符
- 聚合函数
- 索引方法
- 过程语言
并且,因为许可证的灵活,任何人都可以以任何目的 免费使用、修改、分发PostgreSQL, 不管是私用、商用、还是学术研究使用。
PostgreSQL简史
作为一款出名的对象–关系型数据库管理系统, PostgreSQL是从美国加州大学伯克利分校写的POSTGRES软件包发展而来的。 经过超过二十多年的发展滞后,PostgreSQL是世界上最先进的开源的数据库系统。
The Berkeley POSTGRES Project
Michael Stonebraker领导的POSTGRES项目 是由防务高级研究项目局(DARPA)、陆军研究办公室(ARO)、国家科学基金(NSF)、ESL公司共同赞助的。 POSTGRES的实现始于1986年, 该系统最初的概念详见 The design of POSTGRES POSTGRES的设计 ,和 The POSTGRESdata model 中的初始数据模型定义。 最早的数据模型定义见POSTGRES 规则系统的设计。 存储管理器的理论基础和体系结构在 POSTGRES存储系统的设计 里有详细描述。
从那以后,POSTGRES经历了几次主要的版本更新。 第一个“demoware”系统在1987年便可使用了, 并且在1988年的ACM-SIGMOD大会上展出。 在1989年6月发布了版本1(在POSTGRES的实现 里有描述)给一些外部的用户使用。 为了回应用户对第一个规则系统的指正( POSTGRES规则系统的注解 ), 我们重新设计了规则系统( 有关数据库系统的规则,过程,缓存和视图 ),并在1990年6月发布了使用新规则系统的版本2。 版本3在1991年出现,增加了多存储管理器的支持,并且改进了查询执行器,重新编写了规则系统。 从那以后,随后的版本直到Postgres95发布前(见下文),工作都集中在移植性和可靠性上。
POSTGRES已经在许多研究或实际的应用中得到了应用。 这些应用包括:一个财务数据分析系统、一个喷气引擎性能监控软件包、一个小行星跟踪数据库、一个医疗信息数据库和一些地理信息系统。 POSTGRES还被许多大学用于教学用途。 最后,Illustra Information技术(后来并入Informix, 而它现在属于IBM)拿到代码并使之商业化。 在1992年末POSTGRES成为Sequoia 2000 scientific computing project的首要数据管理器。
到了1993年,外部用户的数量几乎翻番。 随着用户的增加,用于源代码维护的时间日益增加,以至占用了太多本应该用于数据库研究的时间, 为了减少支持的负担,伯克利的POSTGRES项目在版本4.2时正式终止。
Postgres95
1994年,Andrew Yu和Jolly Chen向POSTGRES中增加了SQL语言的解释器, 并随后将Postgres95的源代码发布到互联网上供大家使用, 从而成为一个开放源码的原伯克利POSTGRES的继承者。
Postgres95所有源代码都是完全的ANSI C,而且代码量减少了25%, 并且有许多内部修改以利于提高性能和代码的可维护性。 Postgres95版本1.0.x在进行Wisconsin Benchmark测试时大概比POSTGRESv4.2快 30%-50% 。 除了修正了一些错误,下面的是一些主要改进:
- 原来的查询语言PostQUEL被SQL取代(在服务器端实现)。 在PostgreSQL之前还不支持子查询(见下文), 但这个功能可以在Postgres95里面由用户定义的SQL函数实现, 重新实现了聚集,同时还增加了对GROUP BY查询子句的支持。
- 新增加了利用GNUReadline进行交互SQL查询(psql)。 这个程序很大程度上取代了老的monitor程序。
- 增加了新的前端库(libpgtcl), 用以支持以Tcl为基础的客户端。 一个样本shell(pgtclsh), 提供了新的Tcl命令用于Tcl程序和Postgres95后端之间的交互。
- 彻底重写了大对象的接口,保留了将大对象倒转(inversion)作为存储大对象的唯一机制,去掉了倒转(inversion)文件系统。
- 去掉了实例级的规则系统,但我们仍然可以通过重写规则来使用规则。
- 在发布的源码中增加了一个简短的常用SQL和Postgres95特有的SQL特性的教程。
- 用GNUmake取代了BSDmake用于编译。 Postgres95可以使用不加补丁的GCC进行编译(修正了偶数字节数据的对齐问题)。
PostgreSQL
到了1996年,我们很明显的看出“Postgres95”这个名字已经经不起时间的考验了。 于是我们起了一个新名字PostgreSQL 用于反映最初的POSTGRES和最新的使用SQL的版本之间的关系。 同时版本号也重新从6.0开始,将版本号放回到最初的由伯克利POSTGRES项目开始的顺序中。
许多人处于习惯或者拼写简单的原因,将PostgreSQL称为“Postgres”,这种称法被当做绰号或者别名而广泛接受。
Postgres95版本的开发重点放在标明和理解现有的后端代码的问题上。 PostgreSQL开发重点转到了一些有争议的特性和功能上面,当然各个方面的工作同时都在进行。
自那以来,PostgreSQL发生的变化可以在Appendix E发行注记里面找到
格式约定
本书使用下面的格式约定来标记某些特定的文本:新术语、外来词以及其 它重要的段落用斜体着重标出。所有表示计算机的输入与 输出,特别是命令、程序代码、以及屏幕输出等,都用等宽字体 (example)标出。在这样的段落里,斜体 (example)表示占位符,你必须在占位符的 地方插入实际的数值。有时候,部分程序代码会用粗体 (example)显示,这是因为它们 是在前面的例子之后经过了修改。
下面的格式用于命令的大纲:方括弧([和]) 表示可选的部分(在Tcl命令里使用的是问号(?)。花括弧({ })和竖条(|)表示你必须选取一 个候选。连续点(…)表示前面的元素可以重复。
如果能提高清晰度,那么SQL命令使用前缀提示符=>, 而shell命令使用前缀提示符prompt $。不过,通常是不 显示提示符的。
安装
如果你不清楚PostgreSQL是否已经安装,或者 不知道你能否用它做自己的实验,那么你可以自己安装。这么做并不难,并且 是一次很好的练习。
https://www.postgresql.org/download/官网安装地址
PostgreSQL以由任何非特权 用户安装,并不需要超级用户(root)的权限
作者的安装环境是ubuntu 16.04
体系基本概念
PostgreSQL使用一种客户 端/服务器的模式。一次PostgreSQL会话由下列相关的进程(程序)组成:
- 一个服务器进程,它管理数据库文件,接受来自客户端应用与数据库的连接, 并且代表客户端在数据库上执行操作。数据库服务器程序叫postgres。
- 那些需要执行数据库操作的用户客户端(前端)应用。客户端应用可能本身 就是多种多样的:它们可以是一个字符界面的工具,也可以是一个图形界面 的应用,或者是一个通过访问数据库来显示网页的web服务器,或者是一个 特殊的数据库管理工具。一些客户端应用是和PostgreSQL发布一起提供的,但绝大部分是用户开发的。
-
和典型的客户端/服务器应用(C/S应用)一样,这些客户端和服务器可以在不同 的主机上。这时它们通过TCP/IP网络连接通讯。你应该记住的是,在客户机 上可以访问的文件未必能够在数据库服务器机器上访问(或者只能用不同的文件 名进行访问)。
PostgreSQL服务器可以处理来自客户端的多个并发请求。因此,它为每个请求 启动(“forks”)一个新的进程。从这个时候开始,客户端和新服务器进程就不再 经过最初的postgres进程进行通讯。因此,主服务器总是在运行,等待连接, 而客户端及其相关联的服务器进程则是起起停停。当然,用户是肯定看不到这 些事情的。
创建一个数据库
以创建一个mydb新数据库为例:
$ createdb mydb
如果没有报错,那么这一步就成功了,你就可以忽略本节余下的部分了。
如果返回类似信息:
createdb: command not found
说明PostgreSQL没有正确安装,要么是完全没有安装,要么是设置的环境变量有错误,如果是这样,那么可以用绝对路径调用该命令:
$ /usr/local/pgsql/bin/createdb mydb
在你的节点上这个路径可能不一样。请和管理员联系或者看看安装指导以获取 正确的位置。
另外一种响应可能是这样:
createdb: could not connect to database postgres: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket “/tmp/.s.PGSQL.5432”?
这意味着服务器没有启动,或者没有在createdb预期的地方启动。同样, 你也要检查安装指导或者找管理员。
另外一个响应可能是这样:
createdb: could not connect to database postgres: FATAL: role “joe” does not exist
在这里提到了你自己的登陆名。如果管理员没有为你创建PostgreSQL用户帐号, 就会发生这些现像。PostgreSQL用户帐号和操作系统用户帐号是不同的。如果你 就是管理员,参阅Chapter 20以获取创建用户帐号的帮助。
你需要变成安装PostgreSQL 的操作系统用户的身份(通常是postgres)才能创建第一个用户帐号。 也有可能是赋予PostgreSQL用户名和操作系统用户名不同;这种情况下,你需要 使用-U开关或者使用PGUSER环境变量声明PostgreSQL用户名。
python@ubuntu:~$ sudo passwd postgres #更改一个密码
python@ubuntu:~$ su – postgres #切换到操作系统用户身份
postgres@ubuntu:~$ createdb mydb;
postgres@ubuntu:~$
如果你有个数据库用户帐号,但是没有创建数据库所需要的权限,那么你会看到 下面的东西
createdb: database creation failed: ERROR: permission denied to create database
并非所有用户都经过了创建新数据库的授权。如果PostgreSQL拒绝为你创建数据库, 那么你需要让节点管理员赋予你创建数据库的权限。出现这种情况时请咨询你的节点 管理员。如果你自己安装了PostgreSQL,那么你应该以你启动数据库服务器的用户 身份登陆然后参考手册完成权限的赋予工作。 [1]
你还可以用其它名字创建数据库。PostgreSQL 允许你在一个节点上创建任意数量的数据库。数据库名必须是以字母开头并且 小于63个字符长。一个方便的做法是创建和你当前用户名同名的数据库。许多 工具假设它为缺省的数据库名,所以这样可以节省敲键。要创建这样的数据库, 只需要键入:
$ createdb
如果你再也不想使用你的数据库了,那么你可以删除它。比如,如果你是数 据库mydb的属主(创建人),那么你就可以用下面的命令 删除它:
$ dropdb mydb
访问数据库
一旦创建了数据库,你就可以访问它:
- 运行PostgreSQL交互的终端程序 psql,它允许你交互地输入、 编辑、执行SQL命令。
- 使用我们现有的图形前端工具,比如pgAdmin或者 带ODBC或JDBC支持的办公套件来创建和管理数据库。 这种方法在这份教程中没有介绍。
- 使用多种语言绑定中的一种写一个客户应用。这些可能性在Part IV 中有更深入的讨论。
你可能需要启动psql来试验本教程中的例子。你可以用 下面的命令为mydb数据库激活它:
$ psql mydb
如果你省略了数据库名字,那么它缺省就是你的用户账号名字。你已经通过使用 createdb在前面的小节里了解这一点了。
在psql里,你会看到下面的欢迎信息:
psql (9.0.4)
Type “help” for help.
mydb=>
最后一行也可能是:
mydb=#
这个提示符意味着你是数据库超级用户,最可能出现在你自己安装了PostgreSQL 的情况下。作为超级用户意味着你不受访问控制的限制。对于本教程的目的而言, 是否超级用户并不重要。
如果你启动psql时碰到了问题,那么回到前面的小节。 诊断createdb的方法和诊断psql的方 法很类似,如果前者能运行那么后者也应该能运行。
psql打印出的最后一行是提示符,它表示psql 正听着你说话,这个时候你就可以敲入SQL查询到一个psql 维护的工作区中。尝试一下下面的命令:
mydb=> SELECT version();
version
———————————————————————–
PostgreSQL 9.0.4 on i586-pc-linux-gnu, compiled by GCC 2.96, 32-bit
(1 row)
mydb=> SELECT current_date;
date
————
2002-08-31
(1 row)
mydb=> SELECT 2 + 2;
?column?
———-
4
(1 row)
psql程序有一些不属于SQL命令的内部命令。它们以反斜杠 “\“开头。有些这种命令在欢迎信息中列出。比如,你可以用下面的命令获取各种PostgreSQLSQL命令的帮助语法:
mydb=> \h
要退出psql,键入:
mydb=> \q
然后psql就会退出并且返回到命令行shell(要获取更多 有关内部命令的信息,你可以在psql提示符上键入\?)。
mydb=> \? #查看内部命令
小命令
mydb=> \l #l查看所有数据库
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
————+———-+———-+————-+————-+———————–
dailyfresh | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
mydb | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
(6 rows)
tmydb=> \d #查看当前数据库上的表
List of relations
Schema | Name | Type | Owner
——–+———-+——-+———-
public | capitals | table | postgres
public | cities | table | postgres
mydb=>\d cities #\d表名查看表结构
Table “public.cities”
Column | Type | Modifiers
————+———+———–
name | text |
population | real |
altitude | integer |