# 技术勘误

> 对固定英文源版本的修订，以及相应的 PostgreSQL 参考资料。

---

LLMS 索引： [llms.txt](/llms.txt)

---

英文网页版修正了固定源版本中的技术错误，并在每页的归属声明中标明改编情况。原仓库和许可仍可从[出版与许可](/publication/)页查阅。

章节顺序保持不变。三个含逗号的标题已根据各章标题还原，OINK 提供按章序翻页的导航。

页面展示的 SQL 与可下载的 SQL 使用同一份修订后示例。第 54 章和第 56 章则分别展示 Shell 示例和命令参考，并附有 SQL 配套文件。

终端输出仅作示意：日期、UUID、用户、系统目录列表、统计信息和查询计划都取决于运行环境。省略号表示省去的输出。

## 1. 第一次查询 {#chapter-1}

[阅读修订后的章节](/01-first-query/)。

客户端与服务器版本的说明现在区分了已连接服务器报告的版本和本地 psql 可执行文件的版本。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/app-psql.html)。

## 2. psql 基础 {#chapter-2}

[阅读修订后的章节](/02-psql-basics/)。

psql 一章现在说明，-f 会处理反斜线命令；这些命令属于客户端语法，可能向服务器发出系统目录查询。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/app-psql.html)。

## 3. SELECT 基础 {#chapter-3}

[阅读修订后的章节](/03-select-basics/)。

SELECT 的说明不再承诺 SQL 本身不保证的求值顺序。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 4. WHERE {#chapter-4}

[阅读修订后的章节](/04-where/)。

已修复用于生成数列的可运行查询；关于 ILIKE 和 NULL 谓词的说明现在符合 PostgreSQL 规划器及三值逻辑的实际行为。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)、[参考 2](https://www.postgresql.org/docs/17/indexes-types.html)、[参考 3](https://www.postgresql.org/docs/17/functions-comparison.html)。

## 7. LIMIT 与 OFFSET {#chapter-7}

[阅读修订后的章节](/07-limit-offset/)。

OFFSET 开销示例现在准确说明了要处理的行数，修正了相差一行的计数错误。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 8. DISTINCT {#chapter-8}

[阅读修订后的章节](/08-distinct/)。

DISTINCT 示例现在正确说明，在选中的表达式外加括号不会改变用于去重的键。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 9. 空值（NULL） {#chapter-9}

[阅读修订后的章节](/09-nulls/)。

NULL 比较的说明现在区分了结果为未知的比较、DISTINCT 的分组方式以及 IS DISTINCT FROM。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-comparison.html)。

## 10. 表达式 {#chapter-10}

[阅读修订后的章节](/10-expressions/)。

类型转换示例使用了含义明确的输出列名。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/datatype-numeric.html)。

## 11. 数值类型 {#chapter-11}

[阅读修订后的章节](/11-numeric-types/)。

数值范围、溢出行为，以及未指定精度和标度的 numeric 类型的限制，现在都有更准确的说明。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/datatype-numeric.html)。

## 12. 文本类型 {#chapter-12}

[阅读修订后的章节](/12-text-types/)。

字符补空格示例现在区分了字符长度与存储所占的字节长度，也修正了排序规则示例的标签。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-string.html)。

## 13. 布尔值与日期 {#chapter-13}

[阅读修订后的章节](/13-boolean-and-dates/)。

日期与时间一章现在正确说明了 timestamptz 的显示语义，以及 current_timestamp 与 clock_timestamp 的区别。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-datetime.html)。

## 14. UUID 与 JSONB {#chapter-14}

[阅读修订后的章节](/14-uuid-jsonb/)。

UUIDv7 的支持情况现在明确区分版本：PostgreSQL 17 没有内置生成器，PostgreSQL 18 则提供 uuidv7()。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/18/functions-uuid.html)。

## 15. 数组与枚举 {#chapter-15}

[阅读修订后的章节](/15-arrays-and-enum/)。

数组下标的说明现在保留了 PostgreSQL 默认下界这一限定，不再将其说成一成不变的规则。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/arrays.html)。

## 17. 列类型与约束 {#chapter-17}

[阅读修订后的章节](/17-column-types-and-constraints/)。

复合约束和涉及多列的 CHECK 表达式应写在何处，现在有了准确的说明。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-createtable.html)。

## 18. ALTER TABLE 与 DROP {#chapter-18}

[阅读修订后的章节](/18-alter-table-and-drop/)。

ALTER TABLE 的说明现在区分了需要重写表的变更与二进制兼容的变更，并更严谨地说明了重命名与依赖关系。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-altertable.html)。

## 19. 主键与唯一约束 {#chapter-19}

[阅读修订后的章节](/19-primary-keys-and-unique/)。

关于 NULLS NOT DISTINCT 的建议不再把部分唯一索引当作等价方案。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/ddl-constraints.html)、[参考 2](https://www.postgresql.org/docs/17/sql-createtable.html)。

## 21. NOT NULL 与 DEFAULT {#chapter-21}

[阅读修订后的章节](/21-not-null-and-default/)。

表默认值的讨论现在区分了不具有易变性的 current_timestamp 与 random() 这类具有易变性的默认值。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-altertable.html)、[参考 2](https://www.postgresql.org/docs/17/sql-update.html)。

## 22. 标识列与序列 {#chapter-22}

[阅读修订后的章节](/22-identity-and-sequences/)。

序列对象由各个会话共享；currval() 的状态则保存在各自的会话中。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-sequence.html)。

## 23. 模式与 search_path {#chapter-23}

[阅读修订后的章节](/23-schemas/)。

SECURITY DEFINER 和 search_path 的建议现在采用受信任的搜索路径，并将 pg_temp 放在最后；同时明确指出，删除模式的操作在事务提交前可以回滚。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-createfunction.html)、[参考 2](https://www.postgresql.org/docs/17/ddl-schemas.html)。

## 25. UPSERT（ON CONFLICT） {#chapter-25}

[阅读修订后的章节](/25-upsert/)。

ON CONFLICT 示例现在使用实际的约束名，并补充了部分索引注意事项的适用条件。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-insert.html)。

## 26. UPDATE {#chapter-26}

[阅读修订后的章节](/26-update/)。

更新一章现在用 IS DISTINCT FROM 检查值是否发生变化，以正确处理 NULL。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-update.html)。

## 27. DELETE {#chapter-27}

[阅读修订后的章节](/27-delete/)。

DELETE 与 TRUNCATE 的行为说明现在区分了行级触发器、外键检查、加锁、WAL 和回滚语义。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-truncate.html)、[参考 2](https://www.postgresql.org/docs/17/sql-delete.html)、[参考 3](https://www.postgresql.org/docs/17/sql-select.html)。

## 28. RETURNING {#chapter-28}

[阅读修订后的章节](/28-returning/)。

RETURNING 语法的说明以 PostgreSQL 17 为准，并另行标明 PostgreSQL 18 对 old/new 的扩展。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/18/dml-returning.html)、[参考 2](https://www.postgresql.org/docs/17/sql-createtable.html)。

## 29. 内连接与左连接 {#chapter-29}

[阅读修订后的章节](/29-inner-and-left-join/)。

连接一章的提醒不再声称 PostgreSQL 会对合法的交叉连接发出警告，也不再把缺少连接条件的 INNER JOIN 当作合法语法。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 32. UNION、INTERSECT 与 EXCEPT {#chapter-32}

[阅读修订后的章节](/32-union-intersect-except/)。

现在分别说明了 UNION、INTERSECT 和 EXCEPT 的 ALL 形式各自如何处理重复项。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 33. COUNT、SUM 与 AVG {#chapter-33}

[阅读修订后的章节](/33-count-sum-avg/)。

聚合函数处理 NULL 的行为不再一概而论；array_agg 和 jsonb_agg 等聚合函数会保留 NULL 输入。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-aggregate.html)。

## 35. HAVING {#chapter-35}

[阅读修订后的章节](/35-having/)。

WHERE/HAVING 的性能建议现在考虑到了 PostgreSQL 可能将适合的谓词下推。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 36. 标量子查询与 IN 子查询 {#chapter-36}

[阅读修订后的章节](/36-scalar-and-in-subqueries/)。

标量子查询现在正确表述为至多返回一行，返回零行时结果为 NULL。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)、[参考 2](https://www.postgresql.org/docs/17/functions-comparison.html)。

## 37. EXISTS 与派生表 {#chapter-37}

[阅读修订后的章节](/37-exists-and-derived-tables/)。

派生表别名的建议现在说明，PostgreSQL 16 起可以省略别名，同时保留了出于可移植性考虑仍应指定别名的建议。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-select.html)。

## 38. 公用表表达式（WITH） {#chapter-38}

[阅读修订后的章节](/38-cte/)。

关于公用表表达式（CTE）折叠、递归查询中 UNION 的选择、递归不终止的情况以及数据修改 CTE 执行顺序的说明，现在不再作出没有依据的保证。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/queries-with.html)。

## 39. 窗口函数 {#chapter-39}

[阅读修订后的章节](/39-window-functions/)。

窗口帧的默认行为，以及 lag/lead 需要明确排序的要求，现在都有准确的说明。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-window.html)、[参考 2](https://www.postgresql.org/docs/17/sql-select.html)。

## 40. 字符串与数值函数 {#chapter-40}

[阅读修订后的章节](/40-string-and-numeric-functions/)。

示例现在区分了随机整数生成与直接对浮点数进行类型转换，并修正了舍入行为的说明。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-math.html)。

## 41. 日期函数与 COALESCE {#chapter-41}

[阅读修订后的章节](/41-date-functions-and-coalesce/)。

日期分桶与 extract(epoch) 的说明现在与 PostgreSQL 17 的返回类型和日期函数保持一致。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-datetime.html)。

## 42. CASE {#chapter-42}

[阅读修订后的章节](/42-case/)。

FILTER 与 CASE 的比较不再声称两者在空结果上的行为完全相同。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/functions-aggregate.html)。

## 43. 创建索引 {#chapter-43}

[阅读修订后的章节](/43-create-index/)。

多列索引的建议现在考虑了现代规划器可选的方案、锁模式，以及 HOT 更新的行为。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/indexes-multicolumn.html)、[参考 2](https://www.postgresql.org/docs/17/explicit-locking.html)、[参考 3](https://www.postgresql.org/docs/17/indexes-types.html)。

## 44. 何时创建索引 {#chapter-44}

[阅读修订后的章节](/44-when-to-index/)。

索引选择建议去除了通用的选择率百分比阈值，以及适用范围过宽的冗余索引判断规则。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/indexes-types.html)、[参考 2](https://www.postgresql.org/docs/17/indexes-multicolumn.html)、[参考 3](https://www.postgresql.org/docs/17/sql-select.html)。

## 45. EXPLAIN 与查询计划 {#chapter-45}

[阅读修订后的章节](/45-explain/)。

EXPLAIN 示例中的聚合现在统计实际匹配的子表行数；仅索引扫描的说明也补充了可见性映射与堆访问检查之间的关系。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/using-explain.html)、[参考 2](https://www.postgresql.org/docs/17/indexes-index-only-scans.html)。

## 46. BEGIN、COMMIT 与 ROLLBACK {#chapter-46}

[阅读修订后的章节](/46-begin-commit-rollback/)。

事务持久性与试运行局限的说明现在涵盖了正常的持久性设置、序列递增、锁和外部影响；双会话练习也会先重新创建示例表。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/wal-async-commit.html)、[参考 2](https://www.postgresql.org/docs/17/functions-sequence.html)、[参考 3](https://www.postgresql.org/docs/17/sql-createtable.html)。

## 48. 创建视图 {#chapter-48}

[阅读修订后的章节](/48-create-view/)。

CREATE OR REPLACE VIEW 的限制现在与使用 ALTER VIEW 重命名列的操作区分开来。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-createview.html)。

## 49. 物化视图 {#chapter-49}

[阅读修订后的章节](/49-materialized-views/)。

REFRESH MATERIALIZED VIEW CONCURRENTLY 现在明确表述为重新执行完整查询的刷新操作，要求物化视图已填充数据，并具有合适的唯一索引。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-refreshmaterializedview.html)、[参考 2](https://www.postgresql.org/docs/17/sql-select.html)。

## 50. 函数与 PL/pgSQL {#chapter-50}

[阅读修订后的章节](/50-functions-and-plpgsql/)。

已修正函数易变性、SECURITY DEFINER 的搜索路径以及 PL/pgSQL 语句语法的说明。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-createfunction.html)、[参考 2](https://www.postgresql.org/docs/17/plpgsql-structure.html)。

## 51. 触发器 {#chapter-51}

[阅读修订后的章节](/51-triggers/)。

触发器返回值的说明现在区分了 INSERT/UPDATE 与 DELETE，练习也考虑到了脚本中的清理操作。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/plpgsql-trigger.html)。

## 52. 全文检索 {#chapter-52}

[阅读修订后的章节](/52-full-text-search/)。

全文检索练习现在提醒读者，应在脚本删除示例表之前执行练习。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-createtable.html)、[参考 2](https://www.postgresql.org/docs/17/sql-select.html)。

## 53. VACUUM 与 ANALYZE {#chapter-53}

[阅读修订后的章节](/53-vacuum-and-analyze/)。

VACUUM 对可见性映射的作用、尾部页截断以及自动清理的建议，现在都有了更精确的说明。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/routine-vacuuming.html)。

## 54. pg_dump 与 pg_restore {#chapter-54}

[阅读修订后的章节](/54-pg-dump-and-restore/)。

已修正关于 pg_dump 快照、全局对象、版本兼容性和恢复行为的说明，并补充了适用条件。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/app-pgdump.html)、[参考 2](https://www.postgresql.org/docs/17/app-pg-dumpall.html)。

## 55. 角色与 GRANT {#chapter-55}

[阅读修订后的章节](/55-roles-and-grant/)。

角色与 RLS 示例现在对表所有者也强制实施行级安全，并说明了租户设置可被任意修改所带来的局限。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-createrole.html)、[参考 2](https://www.postgresql.org/docs/17/ddl-rowsecurity.html)、[参考 3](https://www.postgresql.org/docs/17/ddl-priv.html)、[参考 4](https://www.postgresql.org/docs/17/sql-alterdefaultprivileges.html)。

## 56. psql 元命令 {#chapter-56}

[阅读修订后的章节](/56-psql-meta-commands/)。

psql 命令参考现在准确涵盖了通过 -f 执行的文件、SQL 替代方式以及 CSV 输出模式。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/app-psql.html)。

## 57. COPY {#chapter-57}

[阅读修订后的章节](/57-copy/)。

已修正 COPY FROM 的触发器行为、编码选择、批量装载性能，以及可直接执行的多行 \copy 练习。

PostgreSQL 文档： [参考 1](https://www.postgresql.org/docs/17/sql-copy.html)、[参考 2](https://www.postgresql.org/docs/17/app-psql.html)。
