PostgreSQL 的开发是由一个互联网相联的开发人员队伍进行的,他们都参加 PostgreSQL 开发邮件列表。目前的协调人是 Marc G. Fournier (scrappy@postgreSQL.org)。(如何加入参阅下文)。这个队伍现在负责 PostgreSQL 所有目前的和未来的开发。
PostgreSQL 1.01 的作者是 Andrew Yu 和 Jolly Chen。还有许多其他人为移植,测试,调试和增强代码做了大量贡献。PostgreSQL 起源的最初的 Postgres 的代码,是在加州大学伯克利分校的 Michael Stonebraker 教授的指导下,由许多研究生,本科生和编程职员完成的。
(Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.)
(IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.)
(THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.)
jolly=> insert into pg_group (groname, grosysid, grolist) jolly=> values ('posthackers', '1234', '{5443, 8261}'); INSERT 548224 jolly=> grant insert on foo to group posthackers; CHANGE jolly=>
pg_group 里的字段是:
groname:组名称。这是一个名称并且应该完全由字母和数字组成。不要包含下划线和其他标点。 grosysid:组 id,这是一个 int4。应该在所有组中唯一。 grolist:属于这个组的 pg_user id 的列表。这是一个 int4[]。
4.5) 你怎样从一个表里面删除一个列? 我们不支持 ALTER TABLE DROP COLUMN,但可以这样做:
SELECT ... -- select all columns but the one you want to remove INTO TABLE new_table FROM old_table; DROP TABLE old_table; ALTER TABLE new_table RENAME TO old_table;
索引通常不用于 ORDER BY 操作:对一个大表的一次顺序扫描然后跟着一个显式的排序比对所有记录的索引扫描要快,因为前者的磁盘访问更少。
当使用模糊操作符,比如 LIKE 或 ~,只有在搜索的开始是挂在字串的开头部分时才用得到索引。因而要使用索引,LIKE 搜索不应该以 % 开头,而~(规则表达式搜索)应该以^ 开头。
4.10) 我如何才能看到查询优化器是怎样计算我的查询的? 参考 EXPLAIN 手册页。
4.11) R-tree 索引是什么? r-tree 索引用于索引空间数据。一个哈希索引无法处理范围搜索。而 B-tree 索引只能处理一维的范围搜索。R-tree 索引可以处理多维数据。例如,如果可以在一个类型为 point 的字段上建立一个 R-tree 索引,那么系统在回答类似 select all points within a bounding rectangle (选择在一个长方形范围内的所有点)这样的查询时有更高的效率。
描述最初的 R-Tree 的设计的规范里面写到:
Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.
你还可以在 Stonebraker 的 "Readings in Database Systems" 找到这篇文章。
4.14) 在一个查询里,我怎样检测一个字段是否为 NULL? 你用 IS NULL 和 IS NOT NULL 测试这个字段。
4.15) 各种字符类型之间有什么不同? Type Internal Name Notes -------------------------------------------------- "char" char 1 character CHAR(#) bpchar blank padded to the specified fixed length VARCHAR(#) varchar size specifies maximum length, no padding TEXT text length limited only by maximum row length BYTEA bytea variable-length array of bytes
4.16.1) 我怎样创建一个序列号/自动递增的字段? PostgreSQL 支持 SERIAL 数据类型。它在字段上自动创建一个序列和索引。例如,这样...
CREATE TABLE person ( id SERIAL, name TEXT );
...会自动转换为这样...
CREATE SEQUENCE person_id_seq; CREATE TABLE person ( id INT4 NOT NULL DEFAULT nextval('person_id_seq'), name TEXT ); CREATE UNIQUE INDEX person_id_key ON person ( id );
参考 create_sequence 手册页获取关于序列的更多信息。你还可以用每行的 oid 字段作为一个唯一值。不过,如果你需要倾倒和重载数据库,你需要使用 pg_dump 的 -o 选项或者 COPY WITH OIDS 选项以保留 oid。
更多信息,参阅 Bruce Momjian 的 行计数 章节。
4.16.2) 我如何获得一个插入后生成的序列号( SERIAL )的值? 可能实现这个要求的最简单的方法是:在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再显式插入。利用 4.16.1 里的例子表,这样做看起来象下面这样:
$newSerialID = nextval('person_id_seq'); INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal');
你还能获得存储在 $newSerialID 里面的新值,可以用于其他查询(例如,作为 person 表的外键)。要注意自动创建的 SEQUENCE 对象的名称将会是命名为
__seq,这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。
类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值,例如,
INSERT INTO person (name) VALUES ('Blaise Pascal'); $newID = currval('person_id_seq');
最后,你可以使用从 INSERT 语句返回的 oid 查找缺省值,尽管这可能是最缺乏移植性的方法。在 perl 里,使用带有 Edmund Mergl 的 DBD::Pg 模块的 DBI,oid 值可以通过 $sth->execute() 后的 $sth->{pg_oid_status} 获得。
4.17) 什么是 oid?什么是 tid? Oid 是 PostgreSQL 的唯一行标识。PostgreSQL 里创建的每一行都获得一个唯一的 oid。所有在 initdb 过程中创建的 oid 都小于 16384 (来自 backend/access/transam.h)。所有用户创建的 oid 都大于或等于这个值。缺省时,所有这些 oid 不仅在一个表,一个数据库里面唯一,而且在整个 PostgreSQL 安装里也是唯一的。
PostgreSQL 在它的内部系统表里使用 oid 在表之间联接行。这些 oid 可以用于标识特定的用户行以及用在联合里。我们建议你使用字段类型 oid 存储 oid 值。参阅 sql(l) 手册页查找其他内部字段。你可以在 oid 字段上创建一个索引以获取快速访问。
Oid 从被所有数据库使用的某个区域里赋值给所有新行。如果你想把 oid 该成别的值,或者你想做一份表的带着原始 oid 的拷贝,你可以做到:
CREATE TABLE new_table(old_oid oid, mycol int); SELECT INTO new SELECT old_oid, mycol FROM old; COPY new TO '/tmp/pgtable'; DELETE FROM new; COPY new WITH OIDS FROM '/tmp/pgtable';
Tid 用于标识带着数据块和偏移量值的特定的物理行。Tid 在每行的更改或者重载后被改变。它们被索引记录用于指引物理行。