FAQ/pt

来自 PostgreSQL wiki
< FAQ(重定向自 Perguntas Frequentes)
跳转到导航跳转到搜索

简介

这是对 英文常见问题的翻译.

有关特定平台问题的文档,请参阅 官方网站.

一般问题

什么是 PostgreSQL?怎么发音?什么是 Postgres?

PostgreSQL 的发音是 Post-Gres-Q-L. (对于好奇如何发音“PostgreSQL”的人,可以找到一个音频文件).

PostgreSQL 是一个对象-关系型数据库系统,它拥有传统商业数据库系统的特性,以及下一代数据库管理系统中的改进。PostgreSQL 是自由软件,完整的源代码可用。

PostgreSQL 的开发由一群分布在世界各地的志愿者(主要是)开发者完成,他们通过互联网进行沟通。这是一个社区项目,不受任何公司的控制。要参与进来,请查看开发者的常见问题解答,网址为 https://postgresql.ac.cn/docs/faqs.FAQ_DEV.html

Postgres 是 PostgreSQL 的一个广泛使用的别称。这是它在伯克利时的最初名称,也是众多别称中最受欢迎的一个。如果你觉得 “PostgreSQL” 太难发音,直接说 “Postgres” 就可以了。


谁控制着 PostgreSQL?

如果你在寻找 PostgreSQL 的维护者、核心委员会或控制公司,就别找了——没有。我们有核心委员会和 CVS 提交者,但这些群体更多地是负责行政工作,而不是控制。这个项目由开发者和用户的社区驱动,任何人都可以加入。你只需要订阅邮件列表并参与讨论。查看开发者常见问题解答,了解如何参与 PostgreSQL 开发的信息。

PostgreSQL 的许可证是什么?

PostgreSQL 在经典 BSD 许可证下发布。基本上,它允许用户对代码做任何事,包括在没有源代码的情况下转售二进制文件。唯一的限制是你不能因为计算机程序的任何问题而对我们负法律责任。还要求此许可证出现在所有计算机程序副本中。以下是我们目前使用的 BSD 许可证。

PostgreSQL 受到以下许可证的约束

PostgreSQL 数据库管理系统

部分版权 (c) 1996-2009,PostgreSQL 全球开发组 部分版权 (c) 1994-1996 加利福尼亚大学董事会

特此授予任何人免费使用、复制、修改和分发此软件及其文档用于任何目的的权限,无论是否收取费用,也不需要书面协议,但以下条件必须满足:

在所有副本中必须包含上述版权声明和本段以及以下两段。

在任何情况下,加利福尼亚大学均不对任何一方因使用此软件及其文档而产生的任何直接、间接、特殊、附带或后果性损害(包括利润损失)负责,即使加利福尼亚大学已被告知此类损害的可能性。


加利福尼亚大学明确不承担任何担保,包括但不限于适销性和适用于特定目的的默示担保。此软件按“现状”提供,加利福尼亚大学没有义务提供维护、支持、更新、增强或修改。

PostgreSQL 可以运行在哪些平台上?

一般来说,任何支持 Unix 的现代平台都应该能够运行 PostgreSQL。在版本发布之前经过测试的平台在安装说明中列出。

PostgreSQL 还可以原生运行在基于 NT 的 Microsoft Windows 操作系统上,例如 Win200 SP4、WinXP 和 Win2003。预先打包的安装程序可以在 http://pgfoundry.org/projects/pginstaller 获取。基于 MS-DOS 的 Windows 版本(Win95、Win98、WinMe)可以使用 Cygwin 运行 PostgreSQL。

http://forge.novell.com 也提供了一个 Novell Netware 6 版本,以及一个 OS/2(eComStation)版本,可以在 http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F 获取。

在哪里可以获得 PostgreSQL?

通过 Web 浏览器,请访问 https://postgresql.ac.cn/ftp/,通过 ftp,请访问 ftp://ftp.postgresql.org/pub/。1.6) 最新版本是什么?

PostgreSQL 的最新版本是 8.2.5 版本。

我们计划每年发布新版本,并在几个月内发布修订版本。

在哪里可以获得支持?

PostgreSQL 社区通过电子邮件为许多用户提供帮助。订阅电子邮件列表的主要网站是 https://postgresql.ac.cn/community/lists/。general 和 bugs 邮件列表是开始的好地方。

您可以从 https://postgresql.ac.cn/support/professional_support 获取提供商业支持的公司列表。

如何报告 Bug?

请访问 PostgreSQL 的 Bug 报告表单 https://postgresql.ac.cn/support/submitbug

您也可以访问我们的 ftp ftp://ftp.postgresql.org/pub 查看是否已有更新版本的 PostgreSQL。

通过表单提交或在 PostgreSQL 邮件列表中报告的 Bug 通常会得到以下回复

   * Não é um bug e o porquê
   * É um bug conhecido e já está na lista de AFAZERES
   * O bug foi corrigido na versão atual
   * O bug foi corrigido mas não foi empacotado em um versão oficial
   * Um pedido foi feito para obter informações detalhadas:
         o Sistema Operacional
         o Versão do PostgreSQL
         o Exemplo de teste que reproduz o bug
         o Informações sobre depuração
         o Saída reconstituidora de vestígios (backtrace) do depurador
   * O bug é novo. O seguinte pode ocorrer:
         o Uma correção é criada e será incluída na próxima versão
         o O bug não pode ser corrigido imediatamente e é adicionado a lista de AFAZERES

如何得知已知 Bug 或缺少的功能?

PostgreSQL 支持扩展的 SQL:2003 子集。请参阅我们的 TODO 列表,其中包含已知 Bug、缺少的功能和未来计划。

功能请求通常会导致以下回复

   * A funcionalidade já está na lista de AFAZERES
   * A funcionalidade não é desejável porque:
         o Ela duplica uma funcionalidade existente que já segue o padrão SQL
         o A funcionalidade aumentará a complexidade do código mas adicionará pouco benefício
         o A funcionalidade será insegura ou não-confiável
   * A nova funcionalidade é adicionada a lista de AFAZERES

PostgreSQL 不使用 Bug 跟踪系统,因为我们发现直接回复邮件并更新 TODO 列表更有效。实际上,Bug 在程序中不会存在太久;影响大量用户的 Bug 会迅速修复。阅读 CVS 邮件日志是了解 PostgreSQL 版本中所有更改、改进和修复的唯一方式。即使是发行说明也不会列出程序中所有更改。

有哪些文档资料可用?

PostgreSQL 包含丰富的文档资料,包括一份完整的参考手册、手册页以及一些测试示例。请参阅 /doc 目录。您也可以在线搜索手册,地址是 https://postgresql.ac.cn/docs

有两本关于 PostgreSQL 的书籍可以在线获取,地址分别为 https://postgresql.ac.cn/docs/books/awbook.htmlhttp://www.commandprompt.com/ppbook/。还有一些关于 PostgreSQL 的书籍可以购买。其中最受欢迎的是 Korry Douglas 撰写的书籍。您可以从 https://postgresql.ac.cn/docs/books/ 获取书籍评论列表。另外,还有一系列关于 PostgreSQL 的技术文章可以在 https://postgresql.ac.cn/docs/techdocs/ 获取。

命令行客户端程序 psql 有几个 \d 命令可以显示关于类型、运算符、函数、聚合等的信息 - 使用 \? 可以查看所有可用命令。

我们的网站还有更多文档资料。

如何学习 SQL?

首先,请考虑上面提到的特定于 PostgreSQL 的书籍。我们的许多用户喜欢《The Practical SQL Handbook》,作者是 Bowman、Judith S. 等人,由 Addison-Wesley 出版。《The Complete Reference SQL》,作者是 Groff 等人,由 McGraw-Hill 出版。这些书也是不错的选择。

网上还有很多不错的教程。

   * http://www.intermedia.net/support/sql/sqltut.shtm
   * http://sqlcourse.com
   * https://w3schools.org.cn/sql/default.asp
   * http://mysite.verizon.net/Graeme_Birchall/id1.html

如何提交补丁或加入开发团队?

请参阅开发者常见问题解答。

PostgreSQL 与其他 DBMS 相比如何?

衡量软件有许多标准:功能、性能、可靠性、支持和价格。

功能

   PostgreSQL tem muitas características presentes em muitos SGBDs comerciais como transações, subconsultas, gatilhos, visões, integridade referencial de chave estrangeira e bloqueio (lock) sofisticado. Nós temos algumas funcionalidades que eles não tem, como tipos definidos pelo usuário, herança, regras e controle de concorrência de múltiplas versões para reduzir bloqueios (locks).

性能

   A performance do PostgreSQL é comparável a outros bancos de dados comerciais e de código livre. Ele é mais rápido em algumas coisas, mais lento em outras. Nossa performance é geralmente +/- 10% comparada a de outros bancos de dados.

可靠性

   Nós sabemos que um SGBD deve ser confiável ou ele é inútil. Nós empenhamos em lançar versões bem testadas, de código estável e que tenha o mínimo de bugs. Cada versão tem no mínimo um mês de teste em versão beta, e nosso histórico de versões mostra que nós podemos fornecer versões estáveis e sólidas que estão prontas para uso em produção. Nós acreditamos que somos comparados a nosso favor com outros sistemas de bancos de dados nessa área.

支持

   Nossas listas de discussão fornecem contato com um grupo de desenvolvedores e usuários para ajudar a resolver muitos problemas encontrados. Enquanto nós não podemos garantir o conserto, SGBDs comerciais nem sempre fornecem também. Com acesso direto aos desenvolvedores, a comunidade de usuários, manuais e o código fonte faz com que o suporte do PostgreSQL seja superior ao de outros SGBDs. Há suporte comercial por incidente disponíveis para aqueles que precisam de um. (Veja seção 1.7 da FAQ).

价格

   Nós somos livres para uso dele tanto comercial quanto não comercial. Você pode adicionar nosso código ao seu produto sem limitações, exceto aquelas descritas na nossa licença BSD mencionada acima.

PostgreSQL 是否会管理由于夏令时而导致的不同国家/地区的时区变化?

美国夏令时更改已包含在 PostgreSQL 8.0.[4+] 版本及所有后续主要版本(例如 8.1)中。加拿大和西澳大利亚的更改已包含在 8.0.[10+]、8.1.[6+] 及所有后续主要版本中。早于 8.0 版本的 PostgreSQL 使用操作系统时区数据库获取夏令时信息。

客户端相关问题

PostgreSQL 有哪些可用接口?

PostgreSQL 安装程序仅包含 C 和嵌入式 C 接口。所有其他接口都是独立的项目,需要单独获取;由于是独立的项目,这些接口有其自己的发布时间和开发团队。

一些编程语言(如 PHP)包含 PostgreSQL 接口。其他语言(如 Perl、TCL、Python)的接口可以在 http://www.pgfoundry.org 获取。

哪些工具可以用于将 PostgreSQL 与网页结合使用?

有关使用数据库的网页的良好介绍,请参阅:http://www.webreview.com

对于 Web 集成,PHP (https://php.ac.cn) 是一个出色的接口。

对于复杂情况,许多人使用 Perl 接口和 DBD::Pg 以及 CGI.pm 或 mod_perl。

PostgreSQL 有用于与用户交互的图形界面吗?

有大量可用于 PostgreSQL 的图形工具(GUI),包括商业工具和开源工具。您可以在 PostgreSQL 社区文档中找到详细的列表。

管理相关问题

如何将 PostgreSQL 安装到与 /usr/local/pgsql 不同的位置?

在运行 configure 时指定 --prefix 选项。

如何控制其他机器的连接?

默认情况下,PostgreSQL 仅允许使用 Unix 域套接字或 TCP/IP 连接从本地机器连接。除非您修改 postgresql.conf 中的 listen_addresses,启用机器身份验证,修改 $PGDATA/pg_hba.conf 文件并重新启动 PostgreSQL 服务器,否则其他机器将无法连接。

如何调整数据库服务器以提高性能?

可以从以下三个主要方面进行调整以提高性能。

更改查询

   Isto involve modificar consultas para obter melhor performance:
       * Criação de índices, incluir expressões e índices parciais
       * Utilização o COPY ao invés de múltiplos comandos INSERTs
       * Agrupamento de múltiplos comandos em uma única transação para diminuir a despesa com efetivações (commit)
       * Utilização do CLUSTER quando recuperar vários registros de um índice
       * Utilização do LIMIT para retornar um subconjunto da saída da consulta
       * Utilização de Consultas preparadas
       * Utilização de ANALYZE para manter as estatísticas do otimizador corretas
       * Utilização regular do VACUUM ou pg_autovacuum
       * Remoção de índices durante grande mudança de dados

服务器配置

   Um grande número de configurações que afetam a performance. Para obter detalhes adicionais, veja Administration Guide/Server Run-time Environment/Run-time Configuration para listagem completa, e para comentários veja http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html e http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.

硬件选择

   O efeito do hardware na performance é detalhado em http://www.powerpostgresql.com/PerfList/ e http://momjian.us/main/writings/pgsql/hw_performance/index.html.

有哪些调试功能可用?

服务器有很多 log_* 配置变量可以启用查询和统计信息的显示,这些信息对调试和性能度量非常有用。

为什么我在尝试连接时收到“抱歉,客户端过多”的错误?

您已达到 100 个会话的默认限制。您需要增加 PostgreSQL 服务器的限制,该限制指定服务器可以启动多少个并发服务器进程。为此,请更改 postgresql.conf 中的 max_connections 值并重新启动 postmaster。

PostgreSQL 的升级流程是什么?

请参阅 https://postgresql.ac.cn/support/versioning,了解有关升级的总体讨论,以及 https://postgresql.ac.cn/docs/current/static/install-upgrading.html,了解具体说明。

我应该使用哪种硬件?

由于 PC 硬件在很大程度上是通用的,人们往往认为所有 PC 硬件的质量都相同。事实并非如此。ECC 内存、SCSI 和高质量主板比廉价硬件更可靠,性能也更高。PostgreSQL 可以在几乎所有硬件上运行,但如果可靠性和性能至关重要,那么明智的做法是研究硬件选项。您可以使用我们的邮件列表讨论硬件选项和问题。

操作相关问题

如何仅检索查询结果中的前几条记录?如何检索一条随机记录?

要仅检索几条记录,如果您在执行 SELECT 时知道所需记录的数量,请使用 LIMIT。如果 ORDER BY 中的列具有对应索引,则可能不需要执行整个查询。如果您在执行 SELECT 时不知道所需记录的数量,请使用游标和 FETCH。

要检索一条随机记录,请使用

   SELECT col
   FROM tab
   ORDER BY random()
   LIMIT 1;

如何找出已定义的表、索引、数据库和用户?如何查看 psql 用于显示这些内容的查询?

在 psql 中使用 \dt 命令可以查看表。要获取 psql 中所有命令的完整列表,您可以使用 \?。或者,您也可以阅读 psql 的源代码,该代码位于 pgsql/src/bin/psql/describe.c 文件中,其中包含用于生成 psql 反斜杠命令输出的 SQL 查询。您也可以使用 -E 选项启动 psql,以便显示用于执行您输入的命令的查询。PostgreSQL 还提供了兼容 SQL 的 INFORMATION_SCHEMA 接口,您可以查询该接口以获取有关数据库的信息。

还有以 pg_ 开头的系统表,它们也可以描述这些信息。

使用 psql -l 可以列出所有数据库。

您也可以查看 pgsql/src/tutorial/syscat.source 文件。该文件说明了获取数据库系统表信息的许多必要的 SELECT 命令。

如何更改列的数据类型?

在 8.0 或更高版本中,可以使用 ALTER TABLE ALTER COLUMN TYPE 轻松更改列的数据类型。

在早期版本中,请执行以下操作

   BEGIN;
   ALTER TABLE tab ADD COLUMN col_nova novo_tipo_dado;
   UPDATE tab SET col_nova = CAST(col_antiga AS novo_tipo_dado);
   ALTER TABLE tab DROP COLUMN col_antiga;
   COMMIT;

之后,您可能希望执行 VACUUM FULL tab 以回收已过期记录占用的磁盘空间。

记录、表和数据库的最大大小是多少?

这些是限制

   Tamanho máximo de um banco de dados?	ilimitado (existem bancos de dados de 32 TB)
   Tamanho máximo de uma tabela?	32 TB
   Tamanho máximo de um registro?	400 GB
   Tamanho máximo de um campo?	1 GB
   Número máximo de registros em uma tabela?	ilimitado
   Número máximo de colunas em uma tabela?	250-1600 dependendo dos tipos das colunas
   Número máximo de índices em uma tabela?	ilimitado

当然,它们不是无限的,而是受可用磁盘空间和内存/交换空间的限制。当这些值变得很大时,性能会受到影响。

32 TB 的最大表大小不需要操作系统的大文件支持。大型表存储为多个 1 GB 文件,因此文件系统限制并不重要。

将默认块大小增加到 32k 可以使表大小、记录大小和最大列数增加四倍。还可以使用表分区来增加表大小。

一个限制是,索引不能创建在超过 2,000 个字符的列上。幸运的是,这种索引很少需要。唯一性最好通过对长列的 MD5 哈希函数的索引来保证,而长文本索引允许在列中搜索单词。

需要多少磁盘空间来存储文本文件数据?

PostgreSQL 数据库将需要高达五倍于存储文本文件数据所需的磁盘空间。

例如,考虑一个包含 100,000 行的文件,每行包含一个整数和一个描述。假设描述的平均大小为二十个字节。该文件将占用 2.8 MB。包含这些数据的 PostgreSQL 数据库文件的大小可以估计为 5.2 MB

   24 bytes: cada cabeçalho de registro (aproximadamente)
   24 bytes: um campo int e um campo texto
  + 4 bytes: ponteiro na página para a tupla
  -------------------------------------------
   52 bytes por registro
  O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então:
  8192 bytes por página
  ------------------------   =  158 registros por página do banco de dados (arredondado para baixo)
    52 bytes por registro
  100000 registros de dados
  ----------------------------  =  633 páginas do banco de dados (arredondado para cima)
     158 registros por página

633 个数据库页面 * 每页 8192 字节 = 5,185,536 字节 (5.2 MB)

索引不需要太多空间,但包含已编入索引的数据,因此它们可能会占用一些空间。

NULL 作为位图存储,因此它们占用的空间很少。

为什么我的查询很慢?为什么它们没有使用我的索引?

索引并非所有查询都使用。索引仅在表大于最小大小且查询仅选择表中一小部分记录时使用。这是因为由索引搜索引起的磁盘随机访问可能比对表进行遍历或顺序搜索更慢。

为了确定是否应该使用索引,PostgreSQL 需要有关于该表的统计信息。这些统计信息是通过使用 VACUUM ANALYZE 或只使用 ANALYZE 收集的。使用统计信息,优化器可以了解表中有多少记录,并且可以更好地确定是否应该使用索引。统计信息也有助于确定最佳连接顺序和连接方法。随着表内容的变化,应该定期收集统计信息。

索引通常不用于 ORDER BY 或执行连接。在大型表中,顺序搜索后进行显式排序通常比使用索引搜索更快。但是,LIMIT 与 ORDER BY 结合使用通常会使用索引,因为只会返回表的一小部分。

如果您认为优化器在选择顺序搜索方面是错误的,请使用 SET enable_seqscan TO 'off' 并再次执行查询,以查看索引搜索是否确实更快。

在使用 LIKE 或 ~ 等通配符运算符时,索引只能在某些情况下使用。

   * O início da cadeia de caracteres da busca deve ser iniciar com uma cadeia de caracteres, i.e.
         o modelos LIKE não devem iniciar com %.
         o modelos ~ (expressões regulares) devem iniciar com ^.
   * A cadeia de caracteres utilizada na busca não pode iniciar com a classe de caracteres e.g. [a-e].
   * Busca que não diferenciam maiúsculas de minúsculas tais como ILIKE e ~* não utilizam índices. Em vez disso, utilize índice de expressão, que é descrito na seção 4.8.
   * O idioma padrão C deve ser usando durante o initdb porque não é possível saber o próximo caracter em idiomas que não sejam o C. Você pode criar um índice especial text_pattern_ops para tais casos que funcionam somente para indexação com LIKE. Também é possível utilizar indexação de busca textual para buscas por palavras.

在 8.0 之前的版本中,索引通常无法使用,除非数据类型与索引的列类型匹配。这在 int2、int8 和 numeric 列索引中尤其明显。

如何查看查询优化器如何评估我的查询?

请参阅手册中的 EXPLAIN 命令。

如何进行正则表达式搜索和不区分大小写的正则表达式搜索?如何使用索引进行不区分大小写的搜索?

运算符 ~ 执行正则表达式评估,而 ~* 执行不区分大小写的正则表达式评估。LIKE 的不区分大小写变体称为 ILIKE。

不区分大小写的相等比较通常表示为

   SELECT *
   FROM tab
   WHERE lower(col) = 'abc';

这不会使用标准索引。但是,如果创建表达式索引,则会使用它。

   CREATE INDEX tabindex ON tab (lower(col));

如果上面的索引被创建为 UNIQUE,虽然该列可以存储大写和小写字符,但它不能具有仅大小写不同的相同值。要强制在列中存储大写或小写字母,请使用 CHECK 约束或触发器。

在查询中,如何检测字段是否为 NULL?如何连接可能的 NULL?如何根据 NULL 或非 NULL 的字段排序?

您可以使用 IS NULL 和 IS NOT NULL 来测试该列,例如

  SELECT *
  FROM tab
  WHERE col IS NULL;

要连接可能的 NULL,请使用 COALESCE(),如下所示

  SELECT COALESCE(col1, ) || COALESCE(col2, )
  FROM tab

要按 NULL 状态排序,请在 ORDER BY 子句中使用 IS NULL 和 IS NOT NULL 修饰符。真值将在假值之前排序,因此以下查询将把 NULL 项放在结果列表的开头

  SELECT *
  FROM tab
  ORDER BY (col IS NOT NULL)

不同字符数据类型之间的区别是什么?

   Tipo	Nome Interno	Observação
   VARCHAR(n)	varchar	tamanho especifica o tamanho máximo, sem preenchimento
   CHAR(n)	bpchar	preenchimento em branco para comprimento fixo específico
   TEXT	text	nenhum limite superior específico no comprimento
   BYTEA	bytea	vetor de bytes de comprimento variável (seguro a byte nulo)
   "char"	char	um caracter

在检查系统目录和一些错误消息时,您将看到内部名称。

上面列出的前四种类型是“varlena”类型(即,磁盘上的前四个字节是长度后跟数据)。因此,实际使用的空间略大于声明的大小。但是,长值也会被压缩,因此磁盘空间也可能远远小于预期。

VARCHAR(n) 最适合存储可变长度的字符串,并且对该字符串的大小有限制。TEXT 用于无限长度的字符串,最大可达一个千兆字节。

CHAR(n) 用于存储长度相同的字符串。CHAR(n) 用空格填充到指定的大小,而 VARCHAR(n) 只存储提供的字符。BYTEA 用于存储二进制数据,尤其是包含 NULL 字节的值。这里描述的所有类型都具有相似的性能特征。

如何创建一个自增序列字段?

PostgreSQL 支持 SERIAL 数据类型。它会自动创建一个序列。例如

   CREATE TABLE pessoa ( 
       id   SERIAL, 
       nome TEXT 
   );

自动转换为

   CREATE SEQUENCE pessoa_id_seq;
   CREATE TABLE pessoa ( 
       id   INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
       nome TEXT 
   );

自动创建的序列名为 <table>_<serialcolumn>_seq,其中 table 和 serialcolumn 分别是表和序列列的名称。有关序列的更多信息,请参阅手册中的 create_sequence 页面。

如何获取 SERIAL 字段的值?

获取序列的下一个 SERIAL 值的最简单方法是使用 RETURNING。使用 4.11.1 中的表示例,它将如下所示

   INSERT INTO pessoa (nome) VALUES ('Blaise Pascal') RETURNING id;

您也可以调用 nextval() 并将该值用于 INSERT,或者在 INSERT 后调用 currval()。

currval() 不会处理与其他用户的竞争条件吗?

不会。currval() 返回您会话分配的当前值,而不是所有会话分配的当前值。

为什么当事务中止时,我的序列号不会被重新使用?为什么我的序列/SERIAL 列号中有间隔?

为了提高并发性,序列值会分配给当前事务,并且不会锁定,直到事务完成。由于中止的事务,这会导致编号中出现间隔。

什么是 OID?什么是 CTID?

如果使用 WITH OIDS 创建表,则每个记录都会收到一个唯一的 OID。OID 会自动分配为 4 字节整数,这些整数在整个安装过程中都是唯一的。但是,它们限制在 40 亿,因此 OID 开始重复。PostgreSQL 使用 OID 来连接系统表。

要对用户表中的记录进行编号,最好使用 SERIAL 而不是 OID,因为 SERIAL 序列仅在单个表中是唯一的;并且它们不太可能达到上限。SERIAL8 可用于存储具有八个字节的序列值。

CTID 用于识别具有块和偏移量值的特定物理记录。在记录被修改或重新加载后,CTID 会发生变化。它们被索引用于指向物理记录。

为什么我收到“ERROR: Memory exhausted in AllocSetAlloc()”错误?

您可能在系统中用完了虚拟内存,或者您的内核对某些资源设置了较低的限制。在启动 PostgreSQL 服务器之前,请尝试以下操作

   ulimit -d 262144
   limit datasize 256m

根据您的 shell,只有一个命令会成功,但它会将您的进程的数据段设置为更高的限制,这可能允许查询执行。此命令适用于当前进程以及在执行该命令后创建的所有子进程。如果您在 SQL 客户端遇到问题,因为服务器进程返回了大量数据,请在启动客户端之前尝试使用它。

如何了解我使用的是哪个版本的 PostgreSQL?

在 psql 中,键入 SELECT version();

如何创建一个默认包含当前时间的列?

使用 CURRENT_TIMESTAMP

CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );

如何执行外部连接(外连接)?

PostgreSQL 使用标准 SQL 语法支持外部连接。这里有两个示例

   SELECT *
   FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

   SELECT *
   FROM t1 LEFT OUTER JOIN t2 USING (col);

这两个完全相同的查询将 t1.col 连接到 t2.col,并将返回所有在 t1 中未连接的记录(那些与 t2 不匹配的记录)。RIGHT 连接将添加来自 t2 表的未连接的记录。FULL 连接将返回组合的记录以及来自 t1 和 t2 的所有未组合的记录。OUTER 一词是可选的,在 LEFT、RIGHT 和 FULL 连接中是隐含的。普通连接被称为内部连接(INNER)。

如何跨多个数据库执行查询?

除了当前数据库之外,没有其他方法可以查询数据库。由于 PostgreSQL 加载特定于数据库的系统目录,因此跨不同数据库的查询行为无法确定。

contrib/dblink 允许使用函数调用查询不同的数据库。当然,客户端可以同时连接到不同的数据库并在客户端合并结果。

如何从函数返回多个记录或列?

使用返回集合的函数很容易,https://postgresql.ac.cn/docs/techdocs.17.

为什么我在 PL/PgSQL 函数中访问临时表时会收到 "relation with OID ###### does not exist" 错误?

在 PostgreSQL < 8.3 版本中,PL/PgSQL 会存储函数的内容,这会导致一个负面影响:如果一个 PL/PgSQL 函数访问一个临时表,然后该表被删除并重新创建,并且该函数再次被调用,那么该函数将会失败,因为函数存储的内容仍然指向旧的临时表。解决方法是在 PL/PgSQL 中使用 EXECUTE 来访问临时表。这将导致查询每次都进行评估。

在 PostgreSQL 8.3 或更高版本中,此问题不会出现。

有哪些复制解决方案可用?

虽然 "复制" 是一个简单的术语,但有许多技术可以实现复制,每种技术都有其优缺点。

主从复制允许主服务器接收读写查询,而从服务器只能接收读查询/SELECT 查询。Slony-I 是最流行的免费 PostgreSQL 主从复制解决方案。

多主复制允许将读写查询发送到多个复制的计算机。这种功能也会对性能产生重大影响,因为需要同步服务器之间的更改。PGCluster 是最流行的免费 PostgreSQL 多主复制解决方案。

还有商业和基于硬件的复制解决方案可用,它们支持各种复制模型。

为什么我的查询无法识别我的表和列名?为什么大小写没有保留?

未知名称最常见的原因是在创建表时在表名或列名周围使用引号。使用引号时,表名和列名(称为标识符)将按指定的方式存储,这意味着您在引用查询中的名称时也必须使用引号。某些界面(如 pgAdmin)会在创建表时自动在标识符周围添加引号。因此,为了识别标识符,您必须

   * Evitar colocar aspas no identificador ao criar tabelas
   * Utilizar somente caracteres minúsculos em identificadores
   * Colocar aspas em identificadores ao referenciá-los nas consultas