打印

PostgreSQL学习文档

PostgreSQL学习文档

何为 PostgreSQL?

PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,版本 4.2为基础的对象关系型数据管理系统(ORDBMS)。 POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据中。

PostgreSQL 是最初的伯克利的代码的一个开放源码的继承人。 它支持大部分 SQL:2003 标准并且提供了许多其他现代特性:

    * 复杂查询
    * 外键
    * 触发器
    * 视图
    * 事务完整性
    * 多版本并发控制

同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的:

    * 数据类型
    * 函数
    * 操作符
    * 聚集函数
    * 索引方法
    * 过程语言

并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发 PostgreSQL, 不管是私用,商用,还是学术研究使用。

TOP

PostgreSQL 的历史简介

现在被称为 PostgreSQL 的对象-关系型数据库管理系统(有一段时间被称为 Postgres95)是从伯克利写的 POSTGRES 软件包发展而来的。经过十几年的发展, PostgreSQL 是世界上可以获得的最先进的开放源码的数据库系统, 它提供了多版本并行控制,支持几乎所有 SQL 构件(包括子查询,事务和用户定 义类型和函数), 并且可以获得非常广阔范围的(开发)语言绑定 (包括 C,C++,Java,perl,tcl,和 python)。
伯克利的 POSTGRES 项目

Michael Stonebraker 领导的 POSTGRES 项目是由防务高级研究项目局(DARPA), 陆军研究办公室(ARO),国家科学基金(NSF), 以及 ESL, Inc 共同赞助的。 POSTGRES 的实现始于 1986 年, 该系统最初的概念详见 POSTGRES的设计。 最早的数据模型定义见 The POSTGRES Data Model。 当时的规则系统设计在 POSTGRES 规则系统的设计 里描述. 存储管理器的理论基础和体系结构在 POSTGRES存储系统的设计 里有详细描述。

从那以后,POSTGRES 经历了几次主要的版本更新。 第一个"演示性"系统在 1987 年便可使用了, 并且在 1988 年的 ACM-SIGMOD 大会上展出。在 1989 年六月发布了版本 1(在 POSTGRES的实现 里有描述)给一些外部的用户使用。 为了回应用户对第一个规则系统的批评,(POSTGRES 规则系统的注解), 我们重新设计了规则系统(有关数据库系统的规则,过程,缓存和视图)并在1990年6月发布了使用新规则系统的版本 2。 版本 3 在1991年出现, 增加了多存储管理器的支持, 并且改进了查 询执行器, 重新编写了规则系统。 从那以后,随后的版本直到 Postgres95 发布前(见下文),工作都集中在移植性和可靠性上。

POSTGRES 已经在许多研究或实际的应用中得到了应用。 这些应用包括: 一个财务数据分析系统,一个喷气引擎性能监控软件包,一个小行星跟踪数据库, 一个医疗信息数据库和一些地理信息系统。 POSTGRES 还被许多大学用于教学用途。 最后, Illustra Information Technologies Illustra Information Technologies (后来并入 Informix) 后者现在属于 IBM) 拿到代码并使之商业化。在 1992 年末 POSTGRES 成为 Sequoia 2000 科学计算计划的首要数据管理器。

到了 1993 年,外部用户的数量几乎翻番。随着用户的增加。 用于源代码维护的时间日益增加 占用了太多本应该用于数据库研究的时间, 为了减少支持的负担,伯克利的POSTGRES 项目在版本 4.2 时正式终止。
Postgres95

在 1994 年, Andrew Yu 和 Jolly Chen 向 POSTGRES 中增加了 SQL 语言的解释器。并随后将 Postgres95 源代码发布到互联网上供大家使用, 成为一个开放源码的,原先伯克利 POSTGRES 代码的继承者。

Postgres95 所有源代码都是完全的 ANSI C , 而且代码量减少了 25%。并且有许多内部修改以利于提高性能和代码的维护性。 Postgres95 版本 1.0.x 在进行 Wisconsin Benchmark 测试时大概比 POSTGRES v4.2 快 30-50%。除了修正了一些错误,下面的是一些主要改进:

    *

      原来的查询语言 PostQUEL 被 SQL 取代(在 server 端实现)。在 PostgreSQL 之前还不支持子查询(见下文)(但这个功能可以在 Postgres95 里面由用户定义的 SQL 函数实现)。重新实现了聚集。同时还增加了对 GROUP BY 查询子句的支持。 C 程序仍可以调用 libpq接口函数。
    *

      新增加了利用 GNU Readline 进行交互 SQL 查询(psql)。 这个程序很大程度上取代了老的 monitor 程序。
    *

      增加了新的前端库, libpgtcl, 用以支持以 Tcl为基础的客户端。一个样本 shell, pgtclsh,提供了新的 Tcl 命令用于 Tcl 程序和 Postgres95 后端之间的交互。
    *

      彻底重写了大对象的接口。 保留了将大对象倒转(Inversion )作为存储大对象的唯一机制。 (去掉了倒转(Inversion )文件系统。)
    *

      去掉了记录级(instance-level )的规则系统。 但我们仍然可以通过重写规则使用规则。
    *

      在发布的源码中增加了一个简短的常用 SQL 和 Postgres95 特有的 SQL 特性的教程。
    *

      用GNU make (取代了 BSD make)用于制作。 Postgres95 可以使用不加补丁的 GCC (修正了偶数字节数据( doubles )的对齐问题)。

PostgreSQL

到了 1996 年, 我们很明显的看出"Postgres95"这个名字已经不能经得起时间 的考验了。于是我们起了一个新名字 PostgreSQL 用于反映最初的 POSTGRES 和最新的使用 SQL 的版本之间的关系。 同时版本号也 重新从 6.0 开始, 将版本号放回到最初的由 伯克利 POSTGRES 项目开始的顺序中。

Postgres95 版本的开发重点放在标明和理解现有的后端代码的问题上。 PostgreSQL 开发重点转到了 一些有争议的特性和功能上面,当然各个方面的工作同时都在进行。

自那以来,PostgreSQL 发生的变化可以在 Appendix E 里面找到。

TOP

习惯

本书使用下面的拓补习惯来标记某些特定的文本:新术语,外来词以及其它重要的段落用斜体着重标出。 所有表示计算机的输入与输出,特别是命令,程序代码,以及屏幕输出等, 都是用等宽字体(例子)。在这样的段落里,斜体(例子)表示占位符; 你必须在占位符的地方插入实际的数值。有时候,部分程序代码会用粗体(例子)显示, 是因为它们是在前面的例子之后经过了修改。

下面的习惯用于命令的大纲:方括弧([ 和 ])表示可选的部分。 (在 Tcl 命令里,使用的是问号 (?),就像通常的 Tcl 一样。) 花括弧({ 和 })和竖条(|)表示你必须选取一个候选。 点(...)表示前面的元素可以重复。

如果能提高清晰度,那么 SQL 命令前缀提示符 =>, 而 shell 命令前缀提示符 $。不过,通常是不显示提示符的。

管理员通常是一个负责安装和运行服务器的人员。 用户可以是任何使用或者需要使用 PostgreSQL 系统任何部分的人员。 我们不应该对这些术语的概念理解得太狭隘;这份文档集在系统管理步骤方面没有固定的假设。
更多信息

除了文档(也就是这本书)以外,其他的一些有关 PostgreSQL 的资源:

FAQs

    常问的问题(FAQ)文档包含经常更新的常见问题。
READMEs

    大多数贡献的包包含 README 文件.
网站

    PostgreSQL 网站里有最新版本的详细信息,即将出现的特性, 和其它能让你更高效地使用 PostgreSQL 的信息.
邮件列表

    邮件列表是解决用户问题的好地方;同时还有其他邮件列表, 详见PostgreSQL网站。
你自己!

    PostgreSQL 是一个开放源码的东西. 也就是说,它靠用户群体进行支持工作.当你刚开始使用 PostgreSQL 时,你将依靠其他人的帮助, 或者是通过文档,或者是通过邮件列表.同时请也将你的知识贡献出来, 如果你学到了一些文档里没有提到的东西,请将其写下来并贡献出来. 如果你给代码增加了特性,请贡献出来.

TOP

问题汇报指导

当你在 PostgreSQL 里碰到臭虫时, 我们也希望能听到它。你的臭虫汇报是将 PostgreSQL 做得更加可靠的一个非常重要的部分, 因为再细致的工作也不能保证在任何情况任何平台下 PostgreSQL的每一个部分都能正常工作。

下面的建议试图帮助你正确格式化臭虫报告, 这样这些报告就能够以一种有效的方法处理。 我们不强迫任何人遵循这些东西,但是这样做对我们每个人都有好处。

我们不能保证能够马上修补每个臭虫。如果臭虫是显而易见的, 很关键的或者影响许多用户,那么很有可能有些人会认真检查它们。 同样我们也可能是告诉你升级到一个新版本, 看看臭虫是否仍然存在。否则,我们可能会说这个臭虫在我们正计划的几个主要改写之前不会得到修补。 或者这个臭虫只是太费事了,而且目前的日程表上有更重要的事情要做。如果你立即需要帮助, 那么请考虑获取一个商业性的支持。
标识臭虫

在你报告臭虫之前这样的问题之前,请一再仔细地读文档, 以确认你确实可以做你在做的事情。如果文档中对你能否处理你所做的事情并不清楚,也请你汇报过来; 因为这个是文档的臭虫。如果发现你的程序的表现不象文档里说的那样,那就是一个臭虫。 这时可能包括(不过不一定局限于)下面的现象:

    *

      程序带着一个致命信号或者一个指向程序错误的操作系统错误信息 (一个反例是一个"disk full"(磁盘满)信息,因为这样的错误必须在 Postgres外部进行修复)退出。
    *

      程序对给出的任何输入都产生错误的输出。
    *

      程序拒绝接收(文档里定义的那些)有效的输入。
    *

      程序对非法输入没有生成任何提示或者错误信息。 但是需要注意的是,你认为非法的输入可能是我们设想的扩展或者与传统兼容的做法。
    *

      在支持的平台上根据指导未能成功地编译、制作或安装 PostgreSQL。

这里的"程序"代表任何可执行文件,而不仅仅是后端服务器。

速度慢或者资源消耗大不算是臭虫。 请阅读文档或者提交邮件列表之一获取调节你的应用(的性能)的帮助。 未能遵循 SQL 标准也不算是一个臭虫, 除非(文档)明确声明了遵守该特定特性。

在你准备继续汇报臭虫之前,请检查 TODO 列表和 FAQ, 看看你报告的臭虫是否已知。如果你不能解析 TODO 列表里面的信息,请汇报你的问题。 至少我们可以把 TODO 列表做得更清晰。
汇报什么

关于汇报臭虫需要记住的最重要的事就是写出所有事实并且只写事实。 不要推测你认为是什么错了,什么"看起来象",或者是推测程序的哪一部分失灵了。 如果你不熟悉 PostgreSQL 的实现, 你很可能猜错因而不能帮我们任何忙。 而且即使你熟悉 Postgres 的实现, 提炼出来的解释也只是事实的补充而不是代替。 如果我们准备修理这个臭虫,我们仍然需要首先亲自看到臭虫的出现。 报告简单的事实相对而言比较直接(你可以从屏幕上拷贝和粘贴), 不过经常发生的是很多人认为这些事实不重要而忽略了重要的细节, 否则汇报总是能够被我们理解。

下面的条目应该包含在所有臭虫汇报里面:

    *

      从 程序启动开始到重现问题的准确步骤顺序。 这应该自包含;要知道如果输出将依赖于表中的数据时, 光把一个光秃秃的SELECT语句发过来而不把前面的 SELECT 和INSERT语句发过来是不够的。 我们没有时间分析你的数据库结构,而且如果我们试着建立我们自己的数据, 那我们就有可能错过问题。

      测试与 SQL 语 言有关的问题的最好的格式是一个可以通过 psql 前端运行并显示问题的文件。 (确保在你的 ~/.psqlrc 启动文件里面没有任何东西。) 一种比较简单的创建这个文件的方法就是用 pg_dump 倾倒表声明和仿真的数据,以及有毛病的查询。 我们鼓励你最小化你的例子,但这不是非做不可的事情。 如果臭虫是可以复现的,那么两种方式都能帮助我们找到它。

      如果你的应用使用其他客户端接口,比如说PHP, 那么请设法隔离出有毛病的查询。我们可能不会设置一个 web 服务器来复现你的问题。 不管怎么说,请记住提供准确的输入文件,而不要猜测问题会在"大文件"或者"中等尺寸的数据库"等等的身上发生。 因为这样的信息太不确切,因而没有什么用处。
    *

      你得到的输出。请不要说它"不起作用"或者"失灵了"。如果有错误信息, 请写明,即使你不能理解也一样。如果程序带着操作系统错误退出,也请写清楚。 如果什么也没有发生,就照直说。即使你的测试实例是程序崩溃或者其他显而易见的现象, 它也有可能不会在我们的平台上发生。如果可能,最简单的事情是从终端拷贝输出。

          注意: 如果你报告一个错误信息,请从信息中获取最冗长的版本。 在 psql 里,事先运行 \set VERBOSITY verbose 就行。 如果你从服务器日志里抽取信息,那么就把运行时参数 log_error_verbosity 设置为 verbose, 这样就会报告所有细节。

          注意: 如果是致命错误,客户端提供的信息可能不会包含所有能得到的信息。 这种情况下, 还要看看数据库服务器的输出。如果你没有保留你的服务器输出,那么现在是做这件事的好机会。

    *

      还有一样很重要的事是声明你期望的输出。 如果你只是写到"这条命令给我这样的输出。"或者"这不是我期望的。",我们可能自己运行它,检查输出, 然后认为看上去很好并且正是我们所期望的输出。 我们不应该把时间花在解析你的命令的语义上。 特别是要避免仅仅说"这不是 SQL 说的/Oracle 做的那样。" 从 SQL 里挖掘出正确的行为可不是好玩的事情, 我们也不能知道所有其他的关系数据库的特性是怎样的。(如果你的问题是程序崩溃,显然你可以忽略这个条目。)
    *

      任何命令行选项和其他启动选项,包括相关的环境变量或者你从缺省值修改以后的配置文件。 同时,还要准确。如果你使用启动系统时自动启动数据库服务器的预打包的版本, 你应该试着找出这些东西是怎样实现的。
    *

      任何你做得与安装指导不一致的东西。
    *

      PostgreSQL 版本。你可以运行命令 SELECT version(); 来检查你正在运行的版本是什么。 大多数可执行程序支持 --version 选项; 至少 postmaster --version 和 psql --version 应该是可以用的。 如果这个函数或者选项不存在,那我们很可能除了告诉你升级外不会说别的东西。 如果你运行预打包的版本,例如 RPM,请说明, 包括那个包可能有的任何子版本号。如果你说的是 CVS 快照,说明之,包括它的日期和时间。
    *

      如果你的版本比 8.0.0 低,我们几乎肯定要告诉你升级。 在每个新版本里都修补了大量的臭虫,所以你在老版本的 PostgreSQL 里碰到的毛病很有可能已经修复掉了。 我们只能对那些使用老版本的 PostgreSQL 的节点提供有限的支持;如果你要求的比我们能提供的更多, 那么考虑一下商业的合同支持。
    *

      平台信息。这包括内核名称和版本,C 库,处理器,存储器信息。 大多数情况下只需要汇报供应商和版本,但是不要指望每个人都很清楚 "Debian" 包括什么东西或者说每个人都运行在 Pentium 上。如果你安装有问题, 那么还要详细汇报你机器上的工具的信息(编译器,make 等)。

不要怕你的臭虫汇报太长。这就是生活。 一开始就汇报所有的事情要比让我们从你那里挤出事实要好。另外, 如果你的输入文件非常巨大,先问问有没有人有兴趣查看它也是合理的。

不要把你的时间花在寻找如何通过修改输入来消除问题的方法上。 这样很可能不会对解决问题有任何帮助。 如果发现不能直接修理臭虫,你还有时间来查找和共享你的绕过方法。 还有,我们再说一便,不要在猜测臭虫 的位置上面浪费时间。我们能够及时找到错误。

在你书写臭虫汇报时,请选用不易混淆的术语。 软件包本身被称为"PostgreSQL",有时简称为 "Postgres"。 当你特指后端服务器进程时, 请明确说明,而不要仅仅是说"PostgreSQL 崩溃了"。 一个独立后端服务器进程的崩溃和父进程 "postmaster" 崩溃是相当不同的; 如果你是说独立后端进程崩溃了,那么请不要说 "postmaster 崩溃",反之亦然。同样,客户端程序, 比如交互式前端 "psql" 是和后端完全独立的。 请试图说明清楚问题是出现再客户端还是服务器端。
到哪里汇报臭虫

通常,把汇报发到 <pgsql-bugs@postgresql.org>臭虫汇报邮件列表。 我们要求你为你的电子邮件消息选用一个描述性的题目, 也许就用错误信息的一部分。

另外一个方法是填充 web 表单形式的臭虫报告,你可以在项目的 web 站点 http://www.postgresql.org/ 找到。 用这种方法输入一个臭虫报告会导致它被发送到 <pgsql-bugs@postgresql.org> 邮递列表。

不要把臭虫汇报发送到任何用户邮件列表里,例如 SQL 语言邮件列表 <pgsql-sql@postgresql.org> 或 通用话题邮件列表<pgsql-general@postgresql.org>。这些邮件列表用于回答用户问题, 而且那些订阅者通常不希望接收臭虫汇报。 更重要的是,他们很可能不会修理这些臭虫。

还有,请不要向开发者邮件列表 <pgsql-hackers@postgresql.org> 发送臭虫汇报。这个列表用于讨论 PostgreSQL 的开发, 因而我们很希望能和臭虫汇报分离开。 如果修理某个毛病需要更多评论, 我们可能会在这个pgsql-hackers列表开一个关于你的臭虫的讨论会。

如果你觉得文档有问题,请发电子邮件到文档邮件列表 <pgsql-docs@postgresql.org>. 在你的问题汇报里面指明你认为哪部分。

如果你的臭虫是一个在不支持平台上的移植性问题,向 移植性问题邮件列表 <pgsql-ports@postgresql.org>, 发送电子邮件,这样我们(还有你)可以一起尝试把 PostgreSQL 移植到你的平台上。

    注意: 由于我们不愿意看到的各种各样的垃圾邮件, 上面的所有电子邮件地址都是封闭的邮件地址。 也就是说,你需要先申请,然后才能发帖子。 (不过,你用 web 表单提交臭虫报告的时候用不着申请。) 如果你只是想发送邮件而不想接受列表的往来的邮件, 你可以提交邮件并且把你的提交选项设置为nomail。 如果需要更多的信息, 你可以向 <majordomo@postgresql.org> 发送一封邮件,邮件的正文只有一个单词help 就可以了。

TOP

1.1. 安装

自然,在你想开始使用 PostgreSQL 之前, 你必须安装它。PostgreSQL 很有可能已经安装到你的节点上了, 因为它包含在你的操作系统的发布里, 或者是系统管理员已经安装了它。如果是这样的话, 那么你应该从操作系统的文档或者你的系统管理员那里获取如何访问 PostgreSQL 的信息。

如果你不清楚 PostgreSQL 是否已经安装, 或者不知道你能否用它(已经安装的)做自己的实验,那么你就可以自己安装。 这么做并不难,并且是一次很好的练习。 PostgreSQL 可以由任何非特权用户安装, 并不需要超级用户 (root) 的权限。

如果你准备自己安装 PostgreSQL, 那么请参考 Chapter 14 获取安装的有关信息, 安装之后再回到这个指导手册来。一定要记住要尽可能遵循有关设置合适的环境变量章节里的信息。

如果你的节点管理员没有按照缺省的方式设置各项相关参数, 那你还有点额外的活儿要干。比如,如果数据库服务器机器是一个远程的机器, 那你就需要把 PGHOST 环境变量设置为数据库服务器那台机器的名字。 环境变量 PGPORT 也可能需要设置。最后一招: 如果当你试着启动一个应用而该应用报告说不能与数据库建立联接时, 你应该马上与你的数据库管理员联系,如果你就是管理员, 那么你就要参考文档以确保你的环境变量得到正确的设置。 如果你不理解随后的几段,那么先阅读下一章。

TOP

1.2. 体系基本概念

在我们开始讲解之前,我们应该先了解 PostgreSQL 系统的基本体系。 理解 PostgreSQL 的部件之间的相互关系将会使本节显得更清晰一些。

在数据库术语里,PostgreSQL 使用一种客户端/服务器的模式。一次 PostgreSQL 会话由下列相关的进程(程序)组成:

    *

      一个服务器进程,它管理数据库文件,接受来自客户端应用与数据库的联接,并且代表客户端在数据库上执行操作。 数据库服务器程序叫做 postmaster。
    *

      那些需要执行数据库操作的用户的客户端(前端)应用。 客户端应用可能本身就是多种多样的:它们可以是一个字符界面的工具, 也可以是一个图形界面的应用,或者是一个通过访问数据库来显示网页的 web 服务器,或者是一个特殊的数据库管理工具。 一些客户端应用是和 PostgreSQL 发布一起提供的,但绝大部分是用户开发的。

和典型的客户端/服务器应用(C/S应用)一样,这些客户端和服务器可以在不同的主机上。 这时它们通过 TCP/IP 网络联接通讯。 你应该记住的是,在客户机上可以访问的文件未必能够在数据库服务器机器上访问(或者只能用不同的文件名进行访问)。

PostgreSQL 服务器可以处理来自客户端的多个并发请求。 因此,它为每个请求启动("fork")一个新的进程。 从这个时候开始,客户端和新服务器进程就不再经过最初的 postmaster 进程的干涉进行通讯。 因此, postmaster 总是在运行,等待着联接, 而客户端和相关联的服务器进程则是起起停停。(当然,用户是肯定看不到这些事情的。我们在这儿谈这些主要是为了完整。)

TOP

1.3. 创建一个数据库

看看你能否访问数据库服务器的第一个例子就是试着创建一个数据库。 一台运行着的 PostgreSQL 服务器可以管理许多数据库。 通常我们会为每个项目和每个用户单独使用一个数据库。

你的节点管理员可能已经为你创建了可以使用的数据库。 他应该已经告诉你这个数据库的名字。如果这样你就可以省略这一步, 并且跳到下一节。

要创建一个新的数据库,在我们这个例子里叫 mydb,你可以使用下面的命令:

$ createdb mydb

它应该生成下面这样的响应:

CREATE DATABASE

如果这样,那么这一步就成功了,你就可以忽略本节余下的部分了。

如果你看到类似下面这样的信息

createdb: command not found

那么就是PostgreSQL没有安装好。要么是就根本没装上, 要么是你的搜索路径没有设置正确。尝试用绝对路径调用该命令试试:

$ /usr/local/pgsql/bin/createdb mydb

在你的节点上这个路径可能不一样。和你的管理员联系或者看看安装指导获取正确的位置。

另外一种响应可能是这样:

createdb: could not connect to database template1: 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 template1: FATAL:  user "joe" does not
exist

在这里提到了你自己的登陆名。如果管理员没有为你创建 PostgreSQL 用户帐号, 就会发生这些现象。(PostgreSQL 用户帐号和操作系统用户帐号是不同的。) 如果你是管理员,参阅 Chapter 17 获取创建用户帐号的帮助。 你需要变成安装 PostgreSQL 的操作系统用户的身份(通常是 postgres)才能创建第一个用户帐号。 也有可能是赋予你的 PostgreSQL 用户名和你的操作系统用户名不同; 这种情况下,你需要使用 -U 开关或者使用 PGUSER 环境变量声明你的 PostgreSQL 用户名。

如果你有个数据库用户帐号,但是没有创建数据库所需要的权限,那么你会看到下面的东西:

createdb: database creation failed: ERROR:  permission denied to create database

并非所有用户都经过了创建新数据库的授权。 如果 PostgreSQL 拒绝为你创建数据库, 那么你需要让节点管理员赋予你创建数据库的权限。出现这种情况时请咨询你的节点管理员。 如果你自己安装了 PostgreSQL, 那么你应该以你启动数据库服务器的用户身份登陆然后参考手册完成权限的赋予工作。 [1]

你还可以用其它名字创建数据库。 PostgreSQL 允许你在一个节点上创建任意数量的数据库。 数据库名必须是以字母开头并且小于 63 个字符长。 一个方便的做法是创建和你当前用户名同名的数据库。 许多工具假设该数据库名为缺省数据库名,所以这样可以节省你的敲键。 要创建这样的数据库,只需要键入

$ createdb

如果你再也不想使用你的数据库了,那么你可以删除它。 比如,如果你是数据库 mydb 的所有人(创建人), 那么你就可以用下面的命令删除它:

$ dropdb mydb

(对于这条命令而言,数据库名不是缺省的用户名。这样你就必须声明它。) 这个动作物理上将所有与该数据库相关的文件都删除并且不可取消, 因此做这件事之前一定要想清楚。
Notes
[1]       

为什么这么干就行了? 解释:PostgreSQL 用户名是和操作系统用户账号分开的。 如果你与一个数据库联接,你可以选择以何种 PostgreSQL 用户名进行联接; 如果你不选择,那么缺省就是你的当前操作系统账号。 如果这样,那么总有一个与操作系统用户同名的 PostgreSQL 用户账号用于启动服务器, 并且通常这个用户都有创建数据库的权限。如果你不想以该用户身份登陆, 那么你也可以在任何提防声明一个 -U 选项以选择一个联接的 PostgreSQL 用户名。

TOP

1.4. 访问数据库

一旦你创建了数据库,你就可以访问它:

    *

      运行 PostgreSQL 交互的终端程序, 叫 psql, 它允许你交互地输入,编辑,和执行 SQL 命令。
    *

      使用我们现有的图形前端工具,比如 PgAccess 或者带 ODBC 支持的办公套件来创建和管理数据库。 这种方法在这份教程中没有介绍。
    *

      写一个客户应用,使用多种语言绑定中的一种。 这些可能性在 Part IV 中有更深入的讨论。

你可能需要启动 psql,试验本教程中的例子。 你可以用下面的命令为 mydb 数据库激活它:

$ psql mydb

如果你省略了数据库名字,那么它缺省就是你的用户账号名字。 你已经在前面的小节里知道这个大纲了。

在 psql 里,你会看到下面的欢迎信息:

Welcome to psql 8.0.0, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

mydb=>

最后一行也可能是

mydb=#

这个提示符意味着你是数据库超级用户,最可能出现在你自己安装了 PostgreSQL 的情况下。作为超级用户意味着你不受访问控制的限制。 对于本教程的目的而言,是否超级用户并不重要。

如果你启动 psql 时碰到了问题,那么回到前面的小节。 诊断 createdb 的方法和诊断 psql 的方法很类似, 如果前者能运行那么后者也应该能运行。

psql 打印出的最后一行是提示符,它表示 psql 正听着你说话,这个时候你就可以敲入 SQL 查询到一个 psql 维护的工作区中。试验一下下面的命令:

mydb=> SELECT version();
                            version
----------------------------------------------------------------
PostgreSQL 8.0.0 on i586-pc-linux-gnu, compiled by GCC 2.96
(1 row)
mydb=> SELECT current_date;
    date
------------
2002-08-31
(1 row)

mydb=> SELECT 2 + 2;
?column?
----------
        4
(1 row)

psql 程序有一些不属于 SQL 命令的内部命令。 它们以反斜杠开头,"\"。 有些这种命令在欢迎信息中列出。比如,你可以用下面的命令获取各种PostgreSQL SQL 命令的帮助语法:

mydb=> \h

要退出 psql,键入

mydb=> \q

然后 psql 就会退出并且给你返回到命令行 shell。 (要获取更多有关内部命令的信息,你可以在 psql 提示符上键入 \?。) psql 的完整功能在 Part VI 中有文档。如果 PostgreSQL 安装正确,那么你还可以在操作系统的 shell 提示符上键入 man psql 来阅读该文档。在这份文档里,我们将不会明确使用这些特性,但是你自己可以在合适的时候使用它们。

TOP

2.1. 介绍

本章提供一个如何使用 SQL 执行简单操作的概述。 本教程的目的只是给你一个介绍,并非完整的 SQL 教程。有许多关于 SQL 的书,包括 Understanding the New SQL 和 A Guide to the SQL Standard。而且你还要知道有些 PostgreSQL语言特性是对标准的扩展。

在随后的例子里,我们假设你已经创建了名为 mydb 的数据库,就象在前面的章里面介绍的一样,并且已经启动了 psql。

本手册的例子也可以在PostgreSQL 源代码发布里的目录 src/tutorial/ 中找到。 要使用这些文件,首先进入该目录然后运行 make:

$ cd ..../src/tutorial
$ make

这样就创建了那些脚本以及编译了包含用户定义函数和类型的 C 文件。 (你必须使用 GNU make 来做这件事情 — 它在你的系统上可能名字是其它什么东西,经常是 gmake。) 要开始这个教程,按照下面说的进行:

$ cd ..../src/tutorial
$ psql -s mydb
...

mydb=> \i basics.sql

\i 命令从指定的文件中读取命令。 -s 选项把你置于单步模式,它在向服务器发送每个语句之前暂停。 在本节使用的命令都在文件 basics.sql 中。
2.2. 概念

PostgreSQL 是一种关系型数据库管理系统 (RDBMS)。 这意味着它是一种用于管理那些以关系形式存储数据的系统。 关系实际上是表的数学称呼。 今天,把数据存储在表里的概念已经快成了固有的常识了, 但是还有其它的一些方法用于组织数据库。 在类 Unix 操作系统上的文件和目录就形成了一种层次数据库的例子。 更现代的发展是面向对象的数据库。

每个表都是一个命名的行的集合。 每一行由一组相同的命名字段组成。 而且每一字段都有一特定的类型。虽然每字段在每行里的位置是固定的, 但一定要记住 SQL 并未对行在表中的顺序做任何保证(但你可以对它们进行明确的排序进行显示)。

表组成数据库,一个由某个 PostgreSQL 服务器管理的数据库集合组成一个数据库集群。

TOP

2.3. 创建新表

你可以通过声明表的名字和所有字段的名字及其类型来创建表∶

CREATE TABLE weather (
    city            varchar(80),
    temp_lo         int,           -- 最低气温
    temp_hi         int,           -- 最高气温
    prcp            real,          -- 降水量
    date            date
);

你可以在 psql 里连换行符一起键入这些东西。 psql 可以识别该命令直到分号才结束。

你可以在 SQL 命令中自由使用空白(也就是空格,tab,和换行符)。 这就意味着你可以用和上面不同的对齐方式键入命令。 两个划线("--" 引入注释。 任何跟在它后面的东西直到该行的结尾都被忽略。 SQL 是对关键字和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的大小写属性(上面没有这么干)。

varchar(80) 声明一个可以存储最长 80 个字符的任意字符串的数据类型。 int 是普通的整数类型。 real 是一种用于存储单精度浮点数的类型。 date 类型应该可以自解释。(没错,类型为 date 的字段名字也是 date。 这么做可能比较方便,也可能容易让人混淆 — 你自己看啦。)

PostgresSQL 支持标准的 SQL 类型 int,smallint, real,double precision, char(N), varchar(N),date, time,timestamp 和 interval,还支持其他的通用类型和丰富的几何类型。 PostgreSQL 可以客户化为定制任意的用户定义的数据类型。 因而类型名并不是语法关键字,除了 SQL92 标准要求支持的特例外。

第二个例子将保存城市和它们相关的地理位置:

CREATE TABLE cities (
    name            varchar(80),
    location        point
);

类型 point 就是一种 PostgreSQL 特有数据类型的例子。

最后,我们还要提到如果你不再需要某个表,或者你想创建一个不同的表,那么你可以用下面的命令删除它:

DROP TABLE tablename;

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-12-3 04:02 京ICP证060528 号

Designed By 17DST