|
|
|
|
@ -141,7 +141,7 @@ |
|
|
|
|
|
|
|
|
|
(Portions copyright (c) 1996-2002, PostgreSQL Global Development |
|
|
|
|
Group |
|
|
|
|
Portions Copyright (c) 1994-6 Regents of the University of |
|
|
|
|
Portions Copyright (c) 1994-6 Regents of the University of |
|
|
|
|
California) |
|
|
|
|
|
|
|
|
|
允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用 |
|
|
|
|
@ -277,7 +277,7 @@ |
|
|
|
|
的书教授 SQL。(译注:我下载到本地了。)在 |
|
|
|
|
http://www.commandprompt.com/ppbook 有另外一本关于 PostgreSQL |
|
|
|
|
的书。在http://www.intermedia.net/support/sql/sqltut.shtm,http://ourw |
|
|
|
|
orld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM 和 |
|
|
|
|
orld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM 和 |
|
|
|
|
http://sqlcourse.com 有一个不错的入门教程。 |
|
|
|
|
|
|
|
|
|
另一个是 "Teach Yourself SQL in 21 Days, Second |
|
|
|
|
@ -320,7 +320,6 @@ |
|
|
|
|
透丛拥乃<EFBFBD>取N颐腔褂幸恍┧<EFBFBD>敲挥械奶匦裕<EFBFBD>缬没Фㄒ謇嘈停<EFBFBD>坛校<EFBFBD> |
|
|
|
|
规则和多版本并行控制以减少锁的争用等。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
性能 |
|
|
|
|
PostgreSQL |
|
|
|
|
和其他商用和开源的数据库具有类似的性能。对某些处理它比较快,对<EFBFBD> |
|
|
|
|
@ -338,7 +337,6 @@ |
|
|
|
|
测试,并且我们的发布历史显示我们可以提供稳定的,牢固的,可用于<EFBFBD> |
|
|
|
|
<EFBFBD><EFBFBD>褂玫陌姹尽N颐窍嘈旁谡夥矫嫖颐怯肫渌<EFBFBD>氖<EFBFBD>菘馊砑<EFBFBD>窍嗟钡摹<EFBFBD> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
支持 |
|
|
|
|
我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰<EFBFBD> |
|
|
|
|
降娜魏挝侍狻N颐遣荒鼙Vた隙<EFBFBD>芙饩鑫侍猓<EFBFBD>啾戎<EFBFBD>拢<EFBFBD>逃<EFBFBD> DBMS |
|
|
|
|
@ -347,7 +345,6 @@ |
|
|
|
|
还要好。还有一些商业性的预包装的支持,可以给提供给那些需要的人<EFBFBD> |
|
|
|
|
#ú卧闹С<EFBFBD> FAQ 条款 1.6 小节。) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
价格 |
|
|
|
|
我们对任何用途都免费,包括商用和非商用目的。你可以不加限制地向<EFBFBD> |
|
|
|
|
愕牟<EFBFBD>防锛尤胛颐堑拇<EFBFBD>耄<EFBFBD><EFBFBD>四切┪颐窃谏厦娴陌嫒ㄉ<EFBFBD>骼锷<EFBFBD>鞯<EFBFBD> |
|
|
|
|
@ -667,7 +664,7 @@ |
|
|
|
|
|
|
|
|
|
4.7) 如何查看表、索引、数据库以及用户的定义? |
|
|
|
|
|
|
|
|
|
psql 有许多反斜杠命令用于显示这些信息。用 \? 看看都有哪些。以 pg_ |
|
|
|
|
psql 有许多反斜杠命令用于显示这些信息。用 \? 看看都有哪些。以 pg_ |
|
|
|
|
打头的系统表也描述了这些信息。 psql -l 可以列出所有的数据库。 |
|
|
|
|
|
|
|
|
|
也可以试试文件 |
|
|
|
|
@ -692,10 +689,10 @@ |
|
|
|
|
常会使用索引,因为只会返回表的一小部分。实际上,虽然 MAX() 和 MIN() |
|
|
|
|
并不使用索引,通过对 ORDER BY 和 LLIMIT |
|
|
|
|
使用索引取得最大值和最小值也是可以的: |
|
|
|
|
SELECT col |
|
|
|
|
FROM tab |
|
|
|
|
ORDER BY col [ DESC ] |
|
|
|
|
LIMIT 1; |
|
|
|
|
SELECT col |
|
|
|
|
FROM tab |
|
|
|
|
ORDER BY col [ DESC ] |
|
|
|
|
LIMIT 1; |
|
|
|
|
|
|
|
|
|
当使用通配符操作,例如 LIKE 或 ~ 时,索引只能在特定的情况下使用: |
|
|
|
|
* 字符串的开始部分必须是普通字符串,也就是说: |
|
|
|
|
@ -740,11 +737,11 @@ |
|
|
|
|
操作符 ~ 处理正则表达式匹配,而 ~* |
|
|
|
|
处理大小写无关的正则表达式匹配。大写些无关的 LIKE 变种成为 ILIKE。 |
|
|
|
|
大小写无关的等式比较通常写做: |
|
|
|
|
SELECT * |
|
|
|
|
FROM tab |
|
|
|
|
WHERE lower(col) = 'abc'; |
|
|
|
|
SELECT * |
|
|
|
|
FROM tab |
|
|
|
|
WHERE lower(col) = 'abc'; |
|
|
|
|
这样将不会使用标准的索引。但是可以创建一个可被利用的函数索引: |
|
|
|
|
CREATE INDEX tabindex ON tab (lower(col)); |
|
|
|
|
CREATE INDEX tabindex ON tab (lower(col)); |
|
|
|
|
|
|
|
|
|
4.13) 在一个查询里,我怎样检测一个字段是否为 NULL? |
|
|
|
|
|
|
|
|
|
@ -752,15 +749,14 @@ |
|
|
|
|
|
|
|
|
|
4.14) 各种字符类型之间有什么不同? |
|
|
|
|
|
|
|
|
|
类型 内部名称 说明 |
|
|
|
|
-------------------------------------------------- |
|
|
|
|
"char" char 1个字符 character |
|
|
|
|
CHAR(#) bpchar |
|
|
|
|
定长字符串,实际数据不足定义长度时,以空格补齐 |
|
|
|
|
VARCHAR(#) varchar |
|
|
|
|
类型 内部名称 说明 |
|
|
|
|
-------------------------------------------------- |
|
|
|
|
"char" char 1个字符 character |
|
|
|
|
CHAR(#) bpchar 定长字符串,实际数据不足定义长度时,以空格补齐 |
|
|
|
|
VARCHAR(#) varchar |
|
|
|
|
指定了最大长度,变长字符串,不足定义长度的部分不补齐 |
|
|
|
|
TEXT text 串长度仅受行的最大长度限制 |
|
|
|
|
BYTEA bytea 变长字节序列(变长的二进制数据) |
|
|
|
|
TEXT text 串长度仅受行的最大长度限制 |
|
|
|
|
BYTEA bytea 变长字节序列(变长的二进制数据) |
|
|
|
|
在系统表和在一些错误信息里你将看到内部名称。 |
|
|
|
|
上面最后四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长<EFBFBD> |
|
|
|
|
龋<EFBFBD>竺娌攀鞘<EFBFBD>荩<EFBFBD>S谑鞘导收加玫目占浔壬<EFBFBD>鞯拇笮∫<EFBFBD>嘁恍<EFBFBD>H欢<EFBFBD>庑├嘈 |
|
|
|
|
@ -776,18 +772,17 @@ |
|
|
|
|
|
|
|
|
|
PostgreSQL 支持 SERIAL |
|
|
|
|
数据类型。它在字段上自动创建一个序列和索引。例如, |
|
|
|
|
CREATE TABLE person ( |
|
|
|
|
id SERIAL, |
|
|
|
|
name TEXT |
|
|
|
|
); |
|
|
|
|
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 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。 |
|
|
|
|
@ -796,8 +791,8 @@ |
|
|
|
|
|
|
|
|
|
一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL |
|
|
|
|
值,然后再显式插入。使用 4.15.1 里的例表,可用伪码这样描述: |
|
|
|
|
new_id = execute("SELECT nextval('person_id_seq')"); |
|
|
|
|
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise |
|
|
|
|
new_id = execute("SELECT nextval('person_id_seq')"); |
|
|
|
|
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise |
|
|
|
|
Pascal')"); |
|
|
|
|
这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为 person |
|
|
|
|
表的外键)。注意自动创建的 SEQUENCE 对象的名称将会是 |
|
|
|
|
@ -805,8 +800,8 @@ |
|
|
|
|
分别是你的表的名称和你的 SERIAL 字段的名称。 |
|
|
|
|
类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 |
|
|
|
|
SERIAL 值,例如, |
|
|
|
|
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); |
|
|
|
|
new_id = execute("SELECT currval('person_id_seq')"); |
|
|
|
|
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); |
|
|
|
|
new_id = execute("SELECT currval('person_id_seq')"); |
|
|
|
|
最后,你可以使用从 INSERT 语句返回的 OID |
|
|
|
|
查找缺省值,尽管这可能是最缺乏移植性的方法。在 Perl 里,使用带有 |
|
|
|
|
Edmund Mergl 的 DBD::Pg 模块的 DBI,oid 值可以通过 $sth->execute() |
|
|
|
|
@ -836,11 +831,11 @@ |
|
|
|
|
值。可以在 OID 字段上创建一个索引以快速访问。 |
|
|
|
|
OID 从一个被所有数据库使用的中心区域里赋值给所有新行。如果你想把 OID |
|
|
|
|
改成别的值,或者想做一份表的带允<EFBFBD> OID 的拷贝,你可以做到: |
|
|
|
|
CREATE TABLE new(old_oid oid, mycol int); |
|
|
|
|
SELECT old_oid, mycol INTO new FROM old; |
|
|
|
|
COPY new TO '/tmp/pgtable'; |
|
|
|
|
DELETE FROM new; |
|
|
|
|
COPY new WITH OIDS FROM '/tmp/pgtable'; |
|
|
|
|
CREATE TABLE new(old_oid oid, mycol int); |
|
|
|
|
SELECT old_oid, mycol INTO new FROM old; |
|
|
|
|
COPY new TO '/tmp/pgtable'; |
|
|
|
|
DELETE FROM new; |
|
|
|
|
COPY new WITH OIDS FROM '/tmp/pgtable'; |
|
|
|
|
OID |
|
|
|
|
用4字节的整数保存,在超过40亿时将溢出。没有人报告出现过溢出,而我们打<EFBFBD> |
|
|
|
|
阍谟腥吮ǜ嬷<EFBFBD>跋<EFBFBD><EFBFBD>飧鱿拗啤<EFBFBD> |
|
|
|
|
@ -851,15 +846,15 @@ |
|
|
|
|
|
|
|
|
|
一些源代码和一些旧一点的文档使用一些有更常用用法的术语。下面是其中一部 |
|
|
|
|
分: |
|
|
|
|
table, relation, class |
|
|
|
|
row, record, tuple |
|
|
|
|
column, field, attribute |
|
|
|
|
retrieve, select |
|
|
|
|
replace, update |
|
|
|
|
append, insert |
|
|
|
|
OID, serial value |
|
|
|
|
portal, cursor |
|
|
|
|
range variable, table name, table alias |
|
|
|
|
table, relation, class |
|
|
|
|
row, record, tuple |
|
|
|
|
column, field, attribute |
|
|
|
|
retrieve, select |
|
|
|
|
replace, update |
|
|
|
|
append, insert |
|
|
|
|
OID, serial value |
|
|
|
|
portal, cursor |
|
|
|
|
range variable, table name, table alias |
|
|
|
|
有一个通用数据库术语的列表:http://hea-www.harvard.edu/MST/simul/softw |
|
|
|
|
are/docs/pkgs/pgsql/glossary/glossary.html 。 |
|
|
|
|
|
|
|
|
|
@ -867,8 +862,8 @@ |
|
|
|
|
|
|
|
|
|
这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启 |
|
|
|
|
动 postmaster 之前试试下面的命令: |
|
|
|
|
ulimit -d 262144 |
|
|
|
|
limit datasize 256m |
|
|
|
|
ulimit -d 262144 |
|
|
|
|
limit datasize 256m |
|
|
|
|
取决于你用的 |
|
|
|
|
shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高<EFBFBD> |
|
|
|
|
<EFBFBD>蚨<EFBFBD>残砟苋貌檠<EFBFBD>瓿伞U馓趺<EFBFBD>钣τ糜诘鼻敖<EFBFBD>蹋<EFBFBD>约八<EFBFBD>性谡馓趺<EFBFBD>钤诵泻 |
|
|
|
|
@ -894,32 +889,31 @@ |
|
|
|
|
4.21) 我如何创建一个缺省值是当前时间的字段? |
|
|
|
|
|
|
|
|
|
使用 CURRENT_TIMESTAMP: |
|
|
|
|
CREATE TABLE test(x int, modtime timestamp DEFAULT |
|
|
|
|
CURRENT_TIMESTAMP); |
|
|
|
|
CREATE TABLE test(x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP); |
|
|
|
|
|
|
|
|
|
4.22) 为什么使用 IN 的子查询这么慢? |
|
|
|
|
|
|
|
|
|
目前,我们通过为外查询的每一行顺序扫描子查询的结果来连接子查询和外查询 |
|
|
|
|
。如果子查询返回少数几行,而外查询返回很多行,IN |
|
|
|
|
执行得很快。为了加快其他 IN 查询的执行,可以用 EXISTS 替换 IN: |
|
|
|
|
SELECT * |
|
|
|
|
FROM tab |
|
|
|
|
WHERE col IN (SELECT subcol FROM subtab); |
|
|
|
|
SELECT * |
|
|
|
|
FROM tab |
|
|
|
|
WHERE col IN (SELECT subcol FROM subtab); |
|
|
|
|
改为: |
|
|
|
|
SELECT * |
|
|
|
|
FROM tab |
|
|
|
|
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col); |
|
|
|
|
SELECT * |
|
|
|
|
FROM tab |
|
|
|
|
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col); |
|
|
|
|
后者要想执行得更快,subcol |
|
|
|
|
应该是一个索引列。我们希望在未来的发布版本中修补这个限制。 |
|
|
|
|
|
|
|
|
|
4.23) 我怎样进行 outer join (外连接)? |
|
|
|
|
|
|
|
|
|
PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子: |
|
|
|
|
SELECT * |
|
|
|
|
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); |
|
|
|
|
SELECT * |
|
|
|
|
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); |
|
|
|
|
或 |
|
|
|
|
SELECT * |
|
|
|
|
FROM t1 LEFT OUTER JOIN t2 USING (col); |
|
|
|
|
SELECT * |
|
|
|
|
FROM t1 LEFT OUTER JOIN t2 USING (col); |
|
|
|
|
这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返饣?t1 |
|
|
|
|
中所有未连接的行(那些在 t2 中没有匹配的行)。右[外]连接(RIGHT OUTER |
|
|
|
|
JOIN)将返回 t2 中未连接的行。完全外连接(FULL OUTER JOIN)将返回 t1 和 |
|
|
|
|
@ -928,14 +922,14 @@ |
|
|
|
|
(INNER JOIN)。 |
|
|
|
|
在此前的版本中,外连接可以用 UNION 和 NOT IN |
|
|
|
|
来模拟。例如,下面的例子在表 tab1 和 tab2 之间做外连接: |
|
|
|
|
SELECT tab1.col1, tab2.col2 |
|
|
|
|
FROM tab1, tab2 |
|
|
|
|
WHERE tab1.col1 = tab2.col1 |
|
|
|
|
UNION ALL |
|
|
|
|
SELECT tab1.col1, NULL |
|
|
|
|
FROM tab1 |
|
|
|
|
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2) |
|
|
|
|
ORDER BY col1 |
|
|
|
|
SELECT tab1.col1, tab2.col2 |
|
|
|
|
FROM tab1, tab2 |
|
|
|
|
WHERE tab1.col1 = tab2.col1 |
|
|
|
|
UNION ALL |
|
|
|
|
SELECT tab1.col1, NULL |
|
|
|
|
FROM tab1 |
|
|
|
|
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2) |
|
|
|
|
ORDER BY col1 |
|
|
|
|
|
|
|
|
|
4.24) 如何使用涉及多个数据库的查询? |
|
|
|
|
|
|
|
|
|
@ -961,8 +955,7 @@ |
|
|
|
|
4.27) 有哪些数据复制选项? |
|
|
|
|
|
|
|
|
|
有几种主/从方式的复制选项。这些选项只允许主数据库进行更新,从数据库只<EFBFBD> |
|
|
|
|
芙<EFBFBD>卸痢M<EFBFBD><EFBFBD> |
|
|
|
|
http://gborg.PostgreSQL.org/genpage?replication_research |
|
|
|
|
芙<EFBFBD>卸痢M<EFBFBD><EFBFBD> http://gborg.PostgreSQL.org/genpage?replication_research |
|
|
|
|
的最后列出了这些选项。在 |
|
|
|
|
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php |
|
|
|
|
正在进行一个多主本复制的解决方案。 |
|
|
|
|
|