常见问题解答/es

来自 PostgreSQL 维基
跳转到导航跳转到搜索

PostgreSQL 西班牙语

关于本文档

这是对 英语常见问题解答 的翻译。

针对特定平台的特定问题的文档位于 官方网站;现有的翻译列在下面

我在哪里可以提出关于 PostgreSQL 西班牙语的问题?

大多数 PostgreSQL 邮件列表都是用英语。如果您想用西班牙语提出技术问题,请使用列表 pgsql-es-ayuda。如果您想讨论 PostgreSQL 的推广话题,请使用列表 pgsql-es-fomento

我在哪里可以获得 PostgreSQL 西班牙语手册?

我们没有官方文档的完整西班牙语翻译。 但是,这个维基 上有一些西班牙语文档。

如何参与西班牙语翻译?

目前我们没有针对官方文档翻译的任何组织的倡议。 如果您愿意,可以翻译维基页面(当然,将翻译存储在维基上的一个新页面中)。 您可能还对参与 PostgreSQL 程序的翻译 感兴趣。

如何将数字金额转换为文字?

您可以使用 这样的函数

一般问题

什么是 PostgreSQL? 如何发音? 什么是 Postgres?

PostgreSQL 的发音是 Post-Gres-Q-L。(对于那些好奇“PostgreSQL”如何发音的人来说,有一个 音频文件。)

PostgreSQL 是一个面向对象的、关系型的数据库系统,具有商业数据库系统中最好的一些特性。 PostgreSQL 是免费的,其完整源代码是可用的。

PostgreSQL 的开发由遍布全球的大多数志愿者开发人员团队完成,他们通过互联网进行沟通。 它是一个社区项目,不受任何公司的控制。 要参与,请参阅 开发人员常见问题解答

"Postgres" 经常被用作 PostgreSQL 的别称。 它最初是伯克利项目的名称,并且比其他别称更受欢迎。 如果您觉得“PostgreSQL”难以发音,可以称之为“Postgres”。

谁控制 PostgreSQL?

如果您正在寻找控制 PostgreSQL 的人、一个中央委员会或一家负责的公司,请不要浪费时间 - 它不存在。 我们有一个指导委员会 (core committee) 和 CVS 树中的提交者,但这些组更多地履行行政职责,而不是控制职责。 该项目由开发人员和用户社区驱动,任何人都可以参与。 您所要做的就是订阅邮件列表并参与讨论。 有关如何参与 PostgreSQL 开发的更多信息,请参阅 开发人员常见问题解答

PostgreSQL 的版权是什么?

PostgreSQL 在经典 BSD 许可下分发。 基本上,这允许用户对代码做任何他们想做的事情,包括在不提供修改后的源代码的情况下重新销售修改后的二进制文件。 唯一的限制是我们不承担您使用该软件所遇到的问题的任何法律责任。 还要求此版权出现在软件的所有副本中。

请注意,我们没有提供许可证文本的翻译。 如果您对许可证文本有任何疑问,请咨询律师。

许可证的最新原始文本(英文)可以在 http://anoncvs.postgresql.org/cvsweb.cgi/~checkout~/pgsql/COPYRIGHT 查看。以下为其副本(2009 年 3 月获取)。

PostgreSQL Database Management System
(formerly known as Postgres, then as Postgres95)

Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994, The Regents of the University of California

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.

PostgreSQL 支持哪些平台?

一般而言,任何现代类 Unix 平台都应该能够运行 PostgreSQL。最近通过测试的平台可以在 测试农场 中找到。官方文档包含有关受支持平台的更多信息,网址为 https://postgresql.ac.cn/docs/current/static/supported-platforms.html

PostgreSQL 也可以在基于 Microsoft Windows NT 的操作系统(如 Win2000 SP4、WinXP 和 Win2003)上原生运行。可以在 https://postgresql.ac.cn/download/windows 获取预编译的安装程序。基于 MSDOS 的 Windows 版本(Win95、Win98、WinME)可以通过 Cygwin 运行 PostgreSQL。

我在哪里可以获取 PostgreSQL?

我们为多种操作系统和平台提供二进制发行版;请访问 我们的下载区域

源代码可以通过网页 https://postgresql.ac.cn/ftp/ 或 FTP ftp://ftp.postgresql.org/pub/ 下载。

最新版本是什么?

可在 我们网站 的首页上找到 PostgreSQL 的最新版本。

我们通常每年发布一个新的主版本,每隔几个月发布一个次版本。次版本的更新通常会同时发布到所有受支持的主版本分支。有关我们的版本控制策略(主版本与次版本)的更多信息,请访问 https://postgresql.ac.cn/support/versioning(英文)。

我在哪里可以获得支持?

PostgreSQL 社区通过电子邮件为许多用户提供支持。订阅邮件列表的主要网站是:https://postgresql.ac.cn/community/lists/。一般列表或错误列表是一个不错的起点。

最大的 IRC 频道是 Libera 的 #postgresql(irc.libera.chat)。您可以使用 Unix 程序 irc -c '#postgresql' "$USER" irc.libera.chat 或其他 IRC 客户端连接。在同一网络上还有西班牙语频道 (#postgresql-es)、法语频道 (#postgresqlfr) 和葡萄牙语频道 (#postgresql-br)。EFnet 上也有一个 PostgreSQL 频道。

商业支持公司列表可在:https://postgresql.ac.cn/support/professional_support 获取。

如何提交错误报告?

请访问 PostgreSQL 错误表单。还可以查看我们的 FTP 站点,查看是否有更新版本的 PostgreSQL。

使用错误表单或发布到任何 PostgreSQL 邮件列表中提交的错误报告通常会产生以下一种回复

  • 这不是错误,原因是...
  • 这是一个已知错误,已列入待办事项列表 (TODO list)。
  • 错误已在当前版本中修复。
  • 错误已修复,但尚未打包到正式发行版中。
  • 要求提供更多详细信息。
    • 操作系统
    • PostgreSQL 版本
    • 可重现的测试用例
    • 调试信息
    • 调试器回溯输出
  • 这是一个新错误。可能会出现以下情况:
    • 将创建补丁,并将其包含在下一次主要或次要版本中。
    • 错误无法立即修复,已添加到待办事项列表中。

如何查找有关已知错误或缺失功能的信息?

PostgreSQL 支持 SQL:2003 的扩展子集。请查看我们的待办事项列表,了解已知错误、缺失功能和未来计划。

功能请求通常会得到以下一种回复:

  * La característica ya está en TODO list
  * La característica  no es la deseada debido a que:
    + Se duplica la funcionalidad existente ya que sigue el estándar SQL.
    + La característica aumentaría la complejidad del código, pero añadiria poco
      beneficio.
    + La característica sería poco fiable o insegura
  * La nueva característica se añade a TODO list

PostgreSQL 不使用错误跟踪系统,因为我们认为直接通过电子邮件回复并保持待办事项列表更新效率更高。实际上,错误不会在软件中持续很长时间,影响大量用户的错误会很快得到修复。在 PostgreSQL 发行版中查找所有更改、改进和修复的唯一方法是阅读 CVS 的日志消息。即使是发行说明也不会列出对软件进行的每次更改。

提供了哪些文档?

PostgreSQL 包含大量文档,包括一个大型手册、man 页面和一些示例测试。请查看 /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://wiki.postgresql.ac.cn/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation 中。

命令行客户端程序 psql 有一些命令(\d)可以显示有关类型、运算符、函数、聚合等的详细信息。使用 \? 显示可用命令。

我们网站还包含更多文档。

如何学习 SQL?

首先,请考虑前面提到的关于 PostgreSQL 的书籍。许多用户还喜欢由 Judith S. Bowman 编辑的《实用 SQL 手册》,Addison-Wesley 出版。另一些用户则喜欢由 Groff 编辑的《SQL 全面参考》,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
   * http://sqlzoo.net

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

请查看 开发者常见问题解答

如何比较 PostgreSQL 与其他 DBMS?

有几种方法可以衡量软件:功能、性能、可靠性、支持和价格。

特性

PostgreSQL 拥有大型 DBMS 中的大多数特性,例如事务、子查询、触发器、视图、外键参照完整性和复杂的锁定。我们还有一些其他 DBMS 不具备的特性,例如用户定义类型、继承、规则和多版本并发控制,可以减少锁定争用。

性能

PostgreSQL 的性能与其他商业和开源数据库相当。在某些方面它更快,而在其他方面它更慢。我们的性能通常与其他数据库相比 +/-10%。

可靠性

我们认识到 DBMS 必须可靠,否则毫无用处。我们会努力发布经过充分测试的、稳定的代码,并尽可能减少错误。每个版本至少经过一个月的 beta 测试,我们的发布历史证明我们能够提供稳定、可靠的版本,适合生产环境使用。我们认为,在这一方面,我们与其他数据库软件相比毫不逊色。

支持

我们的邮件列表为您提供了一个庞大的开发人员和用户社区,可以帮助您解决遇到的问题。虽然我们不能保证修复问题,但商业 DBMS 也不能保证始终修复问题。直接与开发人员、用户社区、手册和源代码进行交流,通常让 PostgreSQL 的支持优于其他 DBMS。对于那些需要额外支持的人,我们可以提供按事件计费的商业支持。(请参阅 常见问题解答第 2.7 节)。

价格

我们对所有用途(商业用途和非商业用途)都是免费的。您可以将我们的代码添加到您的产品中,不受限制,但须遵守我们前面提到的 BSD 风格的许可证中的规定。

PostgreSQL 可以嵌入吗?

PostgreSQL 设计为客户端/服务器架构,需要为每个客户端和服务器以及多个辅助进程创建单独的进程。许多嵌入式架构可以满足这种要求。但是,如果您的嵌入式架构需要数据库服务器在请求进程内运行,则不能使用 PostgreSQL。您需要选择轻量级的数据库解决方案。

如何取消订阅 PostgreSQL 邮件列表?

PostgreSQL 的 Majordomo 页面允许订阅或取消订阅任何 PostgreSQL 邮件列表。(您可能需要将您的 Majordomo 密码发送到您的电子邮件地址才能访问并注册)所有 PostgreSQL 邮件列表都设置为将回复发送到邮件列表和邮件的原始作者。

这样做的目的是让用户尽快收到电子邮件并回复。如果您不希望收到来自列表的电子邮件副本,因为您已经直接收到了电子邮件,请查看 Majordomo 设置页面的取消订阅选项。

您也可以通过取消选中 selfcopy 来阻止您发布到列表中的电子邮件的副本发送给您自己。


用户客户端问题

PostgreSQL 提供了哪些接口?

PostgreSQL 安装只包含 C 和嵌入式 C 接口。所有其他接口都是独立的项目,需要单独下载。独立性使它们能够拥有自己的发布计划和开发团队。

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

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

有关数据库支持的网页的良好介绍,请查看:http://www.webreview.com

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

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

PostgreSQL 有图形用户界面吗?

有大量可用于 PostgreSQL 的 GUI 工具,包括商业工具和开源开发工具。可以在 PostgreSQL 社区 GUI 工具指南中找到详细的列表。


管理问题

如何将 PostgreSQL 安装到 /usr/local/pgsql 之外的其他位置?

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

如何控制来自其他主机的连接?

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

如何调整数据库引擎以获得更好的性能?

主要有三个领域可以提高性能。

查询变更

这涉及修改查询以获得更好的性能

  • 创建索引,包括表达式索引和部分索引。
  • 使用 COPY 而不是多个 INSERT。
  • 将多个语句分组到单个事务中,以减少提交开销。
  • 在从索引中检索大量行时使用 CLUSTER。
  • 使用 LIMIT 返回查询输出的子集。
  • 使用预处理语句 (PREPARED STATEMENTS)。
  • 使用 ANALYZE 来维护优化器统计信息的准确性。
  • 定期使用 VACUUM 或 pg_autovacuum。
  • 在进行大型数据更改时删除索引。

服务器配置

postgresql.conf 中的一系列调整会影响性能。有关详细信息,请参阅管理指南 / 运行时环境 / 运行时配置,有关完整列表,请参阅注释。

硬件选择

硬件对性能的影响在以下文档中进行了详细介绍

有哪些调试功能可用?

https://postgresql.ac.cn/docs/current/interactive/runtime-config-logging.html 中,有许多 log_* 服务器配置变量可以打印查询和统计信息,这对于调试和性能度量非常有用。

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

您已达到默认的 100 个数据库会话限制。您需要增加服务器对并发后端进程数量的限制,您可以从更改 postgresql.conf 文件中的 max_connections 值并重新启动服务器开始。

PostgreSQL 的升级流程是什么?

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

Postgresql 会处理多个国家/地区的最近夏令时更改吗?

从版本 8.0 开始的 PostgreSQL 版本依赖于广泛使用的 tzdata 数据库(也称为 zoneinfo 数据库或 Olson 时区数据库)来获取夏令时信息。要处理影响您的法律夏令时更改,请安装新的 tzdata 文件集并重新启动服务器。

所有更新版本都包含最新版本的 tzdata 文件,因此,使用主版本的次要版本进行更新通常就足够了。

在定期接收包含新 tzdata 文件的更新的平台上,依赖于系统 tzdata 文件副本可能更方便。这可以通过编译时选项实现。大多数 Linux 发行版在预编译的 PostgreSQL 版本中选择了这种方法。

8.0 之前的 PostgreSQL 版本始终依赖于操作系统提供的时区信息。

我应该使用什么计算机硬件?

由于大多数硬件都与 PC 兼容,因此人们往往认为所有 PC 硬件都是一样的。事实并非如此。ECC 内存、SCSI 和优质主板比更便宜的硬件更可靠,性能也更好。PostgreSQL 几乎可以在任何硬件上运行,但如果可靠性和性能很重要,则明智的做法是彻底研究您的硬件选择。具有电池支持缓存的磁盘控制器也很有用。我们的邮件列表可以用于讨论硬件选项和权衡。

操作问题

如何仅选择查询中的前几行?如何随机选择一行?

若要仅检索少量行,如果在 SELECT 时知道所需的线路数量,请使用 LIMIT。如果索引与 ORDER BY 匹配,则可能不需要执行整个查询。如果在 SELECT 时不知道线路数量,请使用游标和 FETCH。

若要选择随机行,请使用

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

如何查找已定义的表、索引、数据库和用户?

在 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 new_col new_data_type;
   UPDATE tab SET new_col = CAST(old_col AS new_data_type);
   ALTER TABLE tab DROP COLUMN old_col;
   COMMIT;

然后,您可能希望对表执行 VACUUM FULL 以回收已过时行使用的磁盘空间。

一行、一张表和一个数据库的最大大小是多少?

以下为限制

   ¿Tamaño máximo para una base de datos? sin limites (existen bases de datos de 32 TB)
   ¿Tamaño máximo para una tabla? 32 TB
   ¿Tamaño máximo para una fila? 400 GB
   ¿Tamaño máximo para un campo? 1 GB
   ¿Número máximo de filas en una tabla? sin limites
   ¿Número máximo de columnas en una tabla? 250-1600 dependiendo el tipo de columna
   ¿Número máximo de índices en una tabla? sin limites

当然,这并不是真正无限的,而是受到可用磁盘空间和内存/交换空间的限制。当这些值异常大时,性能可能会受到影响。

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

通过将默认块大小增加到 32k,表的最大大小、行的大小和最大列数可以增加四倍。还可以使用表分区来增加表的最大大小。一个限制是,无法在长度超过大约 2,000 个字符的列上创建索引。幸运的是,这些索引很少需要。唯一性可以通过对列的 MD5 哈希函数进行索引来最好地保证,而全文索引允许在列中搜索单词。

在数据库中存储典型文本文件中的数据需要多少磁盘空间?

PostgreSQL 数据库可能需要高达五倍于磁盘空间来存储文本文件中的数据。

例如,考虑一个包含 100,000 行的文件,每行包含一个整数和文本描述。假设文本字符串的平均长度为 20 个字节。平面文件将为 2.8 MB。包含这些数据的 PostgreSQL 数据库文件的大小可以估算为 5.2 MB。

      24 bytes: cada fila de cabecera (aproximado)
      24 bytes: un campo int y un campo de texto
     + 4 bytes: punteros en la página de tupla
   -------------------------------------------------
       52 bytes por fila

PostgreSQL 中的数据页面大小为 8192 字节 (8 KB),因此

     8192 bytes por pagina
    ------------------------   =  158 filas por página de base de datos (redondeado hacia abajo)
       52 bytes por fila
      100000 filas de datos
    ------------------------  =  633 páginas de base de datos (redondeado hacia arriba)
      158 filas por pagina
  633 paginas bases de datos * 8192 bytes por pagina  =  5,185,536 bytes (5.2 MB)

索引不需要那么多开销,但它们包含正在索引的数据,因此它们也可能非常大。

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


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

并非每个查询都会使用索引。只有当表大于最小大小并且查询仅选择表中一小部分行时,才会使用索引。这是因为通过索引扫描造成的磁盘随机访问可能比直接扫描表或顺序扫描更慢。

为了确定是否应该使用索引,PostgreSQL 必须具有有关表的统计信息。这些统计信息通过 VACUUM ANALYZE 或仅 ANALYZE 来收集。通过使用统计信息,优化器可以知道表中有多少行,并且可以更好地确定是否应该使用索引。统计信息对于确定最佳顺序和联合方法也很有用。由于表内容会发生更改,因此应定期收集统计信息。

索引通常不用于 ORDER BY 或执行连接操作。对大型表的顺序扫描,然后显式排序,通常比使用索引扫描更快。但是,当 LIMIT 与 ORDER BY 结合使用时,通常会使用索引,因为只返回表的一小部分。

如果您认为优化器在选择扫描顺序方面出错,请使用 SET enable_seqscan TO 'off' 并重新执行查询,看看索引扫描是否确实更快。

在使用 LIKE 或 ~ 等搜索运算符时,索引只能在特定情况下使用。

  • 搜索字符串的开头必须锚定在字符串的开头,也就是说,
    • LIKE 模式不能以 % 开头。
    • ~(正则表达式)模式必须以 ^ 开头。
  • 搜索字符串不能以字符类开头,例如 [a-e]。
  • 不区分大小写的搜索,例如 ILIKE 和 ~*,不使用索引。相反,它们使用索引表达式,这些表达式在第 4.8 节中描述。
  • 在 initdb 期间,应该使用 C 默认区域设置,因为无法在非 C 区域设置中知道下一个更大的字符。您可以为这些情况创建一个特殊的 text_pattern_ops 索引,这仅适用于 LIKE 索引。您还可以充分利用文本索引进行词语搜索。

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

这可以通过 EXPLAIN 命令完成;请参阅 Using EXPLAIN

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

~ 运算符执行正则表达式比较,而 ~* 运算符执行不区分大小写的正则表达式比较。它类似于使用 LIKE 或 ILIKE。

要执行不区分大小写的相等搜索,可以按如下方式表达

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

但是,此表达式不会使用标准索引。但是,如果您创建索引表达式,它将被使用。

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

如果将上面的索引创建为 UNIQUE,即使列可以存储大小写混合的字符,它也不能具有仅在大小写方面不同的值。要使特定列始终以大写或小写存储,请使用 CHECK 或 CONSTRAINT 或 TRIGGER。

在查询中,如何检测字段是否为 NULL?如何连接 NULL 值?如何根据字段是否为 NULL 进行排序?

通过测试列是否为 NULL 或不为 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 修饰符。True 可以排序为 False,因此以下将使 NULL 项在结果列表的顶部:

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

不同字符类型之间有什么区别?

  Tipo    Nombre Interno                    Notas
  VARCHAR(n) varchar       especifica el tamaño de longitud máxima, no rellena
  CHAR(n)    bpchar        adiciona espacios en blanco hasta la longitud especifica
  TEXT       text          no específica límite máximo en la longitud
  BYTEA      bytea         arreglo de byte de longitud variable (incluye null-byte)
  "char"     char          un carácter


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

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

当存储可变长度字符串并限制字符串长度时,VARCHAR(n) 是最佳选择。

TEXT 用于无限长度的字符串,最大长度为 1 GB。

CHAR(n) 用于存储所有长度相同的字符串。CHAR(n) 用空格填充到指定的长度,而 VARCHAR(n) 只存储提供的字符。

BYTEA 用于存储二进制数据,特别是包含 NULL 字节的值。

此处描述的所有类型都具有相同的操作特性。

如何创建自增字段?

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
 );

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

如何获取插入 SERIAL 的值?

最简单的方法是使用 RETURNING 获取分配给 SERIAL 的值。使用表 4.11.1 中的示例,它将如下所示

 INSERT INTO persona (nombre) 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: 内存不足 AllocSetAlloc()”错误?

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

  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 允许使用函数调用查询来访问数据库。当然,客户端也可以同时连接到不同的数据库并在客户端侧组合结果。

如何从函数返回多行或多列?

这使用 SRF(“返回集的函数”)很容易实现:Return_more_than_one_row_of_data_from_PL/pgSQL_functions

为什么在 PL/pgsql 函数中访问临时表时,我收到“关系 OID ##### 不存在”错误?

在 PostgreSQL <8.3 版本中,PL/PgSQL 函数的脚本会导致一个不幸的副作用,即如果 PL/PgSQL 函数访问了一个临时表,并且该表随后被删除和重新创建,并且函数再次被调用,该函数将失败,因为函数内容仍将在旧临时表的位置被缓存。解决方案是在 PL/PgSQL 中使用 EXECUTE 来访问临时表。这会导致每次都重新解析查询。

PostgreSQL 8.3 及更高版本中没有此问题。

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

尽管“复制”是一个简单的术语,但有几种技术可以实现复制,每种技术都有其优缺点。

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

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

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

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

最常见的原因是在创建表时在表或列名周围使用双引号。使用双引号时,表和列名(称为标识符)将以区分大小写的方式存储,这意味着在查询中引用名称时必须使用双引号。一些界面(例如 pgAdmin)会在创建表时自动在标识符周围加上双引号。因此,为了识别标识符,您需要:

  • 在创建表时避免用双引号引用标识符
  • 仅在标识符中使用小写字符
  • 在查询中引用标识符时使用双引号。