Convert Chinese FAQ to valid XHTML, finally.

This commit is contained in:
Bruce Momjian 2005-05-17 04:17:47 +00:00
parent 472f9be471
commit 5e1bfa82dd
2 changed files with 1032 additions and 881 deletions

View File

@ -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.shtmhttp://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 @@
透丛拥乃<E68BA5>颐腔褂幸恍┧<E6818D>敲挥械奶匦裕<E58CA6>缬没Фㄒ謇嘈停<E59888>坛校<E59D9B>
规则和多版本并行控制以减少锁的争用等。
性能
PostgreSQL
和其他商用和开源的数据库具有类似的性能。对某些处理它比较快<EFBC8C>
@ -338,7 +337,6 @@
测试并且我们的发布历史显示我们可以提供稳定的牢固的可用于<E794A8>
<20><>褂玫陌姹尽颐窍嘈旁谡夥矫嫖颐怯肫渌<E882AB><EFBFBD>菘馊砑<E9A68A>窍嗟钡摹<E992A1>
支持
我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰<E68980>
降娜魏挝侍狻颐遣荒鼙た隙<E3819F>芙饩鑫侍猓<E4BE8D>啾戎<E595BE><EFBFBD><EFBFBD> DBMS
@ -347,7 +345,6 @@
还要好。还有一些商业性的预包装的支持可以给提供给那些需要的人<E79A84>
ú卧闹С<E997B9> FAQ 条款 1.6 小节。)
价格
我们对任何用途都免费包括商用和非商用目的。你可以不加限制地向<E59CB0>
愕牟<E68495>防锛尤胛颐堑拇<E5A091><EFBFBD><E88084>四切┪颐窃谏厦娴陌嫒ㄉ<E5AB92>骼锷<E9AABC><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"变长类型也就是说开头的四个字节是长<E698AF>
<>竺娌攀鞘<E69480><EFBFBD>谑鞘导收加玫目占浔壬<E6B594>鞯拇笮∫<E7ACAE>嘁恍<E59881><EFBCA8>庑├嘈
@ -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 模块的 DBIoid 值可以通过 $sth->execute()
@ -836,11 +831,11 @@
值。可以在 OID 字段上创建一个索引以快速访问。
OID 从一个被所有数据库使用的中心区域里赋值给所有新行。如果你想把 OID
改成别的值或者想做一份表的带允<E5B8A6> 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亿时将溢出。没有人报告出现过溢出而我们打<E4BBAC>
阍谟腥吮ǜ嬷<C79C><EFBFBD><E8B78B>飧鱿拗啤<E68B97>
@ -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上面命令只有一条能成功但是它将把你的进程数据段限制设得比较高<E8BE83>
<20><EFBFBD>残砟苋貌檠<E8B28C>瓿伞馓趺<E9A693>钣τ糜诘鼻敖<E9BCBB><EFBFBD>约八<E7BAA6>性谡馓趺<E9A693>钤诵泻
@ -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) 有哪些数据复制选项?
有几种主/从方式的复制选项。这些选项只允许主数据库进行更新从数据库只<E5BA93>
<>卸痢<E797A2><EFBCAD>
http://gborg.PostgreSQL.org/genpage?replication_research
<>卸痢<E797A2><EFBCAD> http://gborg.PostgreSQL.org/genpage?replication_research
的最后列出了这些选项。在
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php
正在进行一个多主本复制的解决方案。

File diff suppressed because it is too large Load Diff