目录 搜索
前言 何为PostgreSQL? PostgreSQL简史 格式约定 更多信息 臭虫汇报指导 I. 教程 章1. 从头开始 1.1. 安装 1.2. 体系基本概念 1.3. 创建一个数据库 1.4. 访问数据库 章2. SQL语言 2.1. 介绍 2.2. 概念 2.3. 创建新表 2.4. 向表中添加行 2.5. 查询一个表 2.6. 表间链接 2.7. 聚集函数 2.8. 更新 2.9. 删除 章3. 高级特性 3.1. 介绍 3.2. 视图 3.3. 外键 3.4. 事务 3.5. 窗口函数 3.6. 继承 3.7. 结论 II. SQL语言 章4. SQL语法 4.1. 词法结构 4.2. 值表达式 4.3. 调用函数 章5. 数据定义 5.1. 表的基本概念 5.2. 缺省值 5.3. 约束 5.4. 系统字段 5.5. 修改表 5.6. 权限 5.7. 模式 5.8. 继承 5.9. 分区 5.10. 其它数据库对象 5.11. 依赖性跟踪 章 6. 数据操作 6.1. 插入数据 6.2. 更新数据 6.3. 删除数据 章7. 查询 7.1. 概述 7.2. 表表达式 7.3. 选择列表 7.4. 组合查询 7.5. 行排序 7.6. LIMIT和OFFSET 7.7. VALUES列表 7.8. WITH的查询(公用表表达式) 章8. 数据类型 8.1. 数值类型 8.2. 货币类型 8.3. 字符类型 8.4. 二进制数据类型 8.5. 日期/时间类型 8.6. 布尔类型 8.7. 枚举类型 8.8. 几何类型 8.9. 网络地址类型 8.10. 位串类型 8.11. 文本搜索类型 8.12. UUID类型 8.13. XML类型 8.14. 数组 8.15. 复合类型 8.16. 对象标识符类型 8.17. 伪类型 章 9. 函数和操作符 9.1. 逻辑操作符 9.2. 比较操作符 9.3. 数学函数和操作符 9.4. 字符串函数和操作符 9.5. 二进制字符串函数和操作符 9.6. 位串函数和操作符 9.7. 模式匹配 9.8. 数据类型格式化函数 9.9. 时间/日期函数和操作符 9.10. 支持枚举函数 9.11. 几何函数和操作符 9.12. 网络地址函数和操作符 9.13. 文本检索函数和操作符 9.14. XML函数 9.15. 序列操作函数 9.16. 条件表达式 9.17. 数组函数和操作符 9.18. 聚合函数 9.19. 窗口函数 9.20. 子查询表达式 9.21. 行和数组比较 9.22. 返回集合的函数 9.23. 系统信息函数 9.24. 系统管理函数 9.25. 触发器函数 章10. 类型转换 10.3. 函数 10.2. 操作符 10.1. 概述 10.4. 值存储 10.5. UNION 章11. 索引 11.1. 介绍 11.2. 索引类型 11.3. 多字段索引 11.4. 索引和ORDER BY 11.5. 组合多个索引 11.6. 唯一索引 11.7. 表达式上的索引 11.8. 部分索引 11.9. 操作类和操作簇 11.10. 检查索引的使用 章12. Full Text Search 12.1. Introduction 12.2. Tables and Indexes 12.3. Controlling Text Search 12.4. Additional Features 12.5. Parsers 12.6. Dictionaries 12.7. Configuration Example 12.8. Testing and Debugging Text Search 12.9. GiST and GIN Index Types 12.10. psql Support 12.11. Limitations 12.12. Migration from Pre-8.3 Text Search 章13. 并发控制 13.1. 介绍 13.2. 事务隔离 13.3. 明确锁定 13.4. 应用层数据完整性检查 13.5. 锁和索引 章14. 性能提升技巧 14.1. 使用EXPLAIN 14.2. 规划器使用的统计信息 14.3. 用明确的JOIN语句控制规划器 14.4. 向数据库中添加记录 14.5. 非持久性设置 III. 服务器管理 章15. 安装指导 15.1. 简版 15.2. 要求 15.3. 获取源码 15.4. 升级 15.5. 安装过程 15.6. 安装后的设置 15.7. 支持的平台 15.8. 特殊平台的要求 章16. Installation from Source Code on Windows 16.1. Building with Visual C++ or the Platform SDK 16.2. Building libpq with Visual C++ or Borland C++ 章17. 服务器安装和操作 17.1. PostgreSQL用户帐户 17.2. 创建数据库集群 17.3. 启动数据库服务器 17.4. 管理内核资源 17.5. 关闭服务 17.6. 防止服务器欺骗 17.7. 加密选项 17.8. 用SSL进行安全的TCP/IP连接 17.9. Secure TCP/IP Connections with SSH Tunnels 章18. 服务器配置 18.1. 设置参数 18.2. 文件位置 18.3. 连接和认证 18.4. 资源消耗 18.5. 预写式日志 18.6. 查询规划 18.7. 错误报告和日志 18.8. 运行时统计 18.9. 自动清理 18.10. 客户端连接缺省 18.12. 版本和平台兼容性 18.11. 锁管理 18.13. 预置选项 18.14. 自定义的选项 18.15. 开发人员选项 18.16. 短选项 章19. 用户认证 19.1. pg_hba.conf 文件 19.2. 用户名映射 19.3. 认证方法 19.4. 用户认证 章20. 数据库角色和权限 20.1. 数据库角色 20.2. 角色属性 20.3. 权限 20.4. 角色成员 20.5. 函数和触发器 章21. 管理数据库 21.1. 概述 21.2. 创建一个数据库 21.3. 临时库 21.4. 数据库配置 21.5. 删除数据库 21.6. 表空间 章22. 本土化 22.1. 区域支持 22.2. 字符集支持 章23. 日常数据库维护工作 23.1. Routine Vacuuming日常清理 23.2. 经常重建索引 23.3. 日志文件维护 章24. 备份和恢复 24.1. SQL转储 24.2. 文件系统级别的备份 24.3. 在线备份以及即时恢复(PITR) 24.4. 版本间迁移 章25. 高可用性与负载均衡,复制 25.1. 不同解决方案的比较 25.2. 日志传送备份服务器 25.3. 失效切换 25.4. 日志传送的替代方法 25.5. 热备 章26. 恢复配置 26.1. 归档恢复设置 26.2. 恢复目标设置 26.3. 备服务器设置 章27. 监控数据库的活动 27.1. 标准Unix工具 27.2. 统计收集器 27.3. 查看锁 27.4. 动态跟踪 章28. 监控磁盘使用情况 28.1. 判断磁盘的使用量 28.2. 磁盘满导致的失效 章29. 可靠性和预写式日志 29.1. 可靠性 29.2. 预写式日志(WAL) 29.3. 异步提交 29.4. WAL配置 29.5. WAL内部 章30. Regression Tests 30.1. Running the Tests 30.2. Test Evaluation 30.3. Variant Comparison Files 30.4. Test Coverage Examination IV. 客户端接口 章31. libpq-C库 31.1. 数据库联接函数 31.2. 连接状态函数 31.3. 命令执行函数 31.4. 异步命令处理 31.5. 取消正在处理的查询 31.6. 捷径接口 31.7. 异步通知 31.8. 与COPY命令相关的函数 31.9. Control Functions 控制函数 31.10. 其他函数 31.11. 注意信息处理 31.12. 事件系统 31.13. 环境变量 31.14. 口令文件 31.15. 连接服务的文件 31.16. LDAP查找连接参数 31.17. SSL支持 31.18. 在多线程程序里的行为 31.19. 制作libpq程序 31.20. 例子程序 章32. 大对象 32.1. 介绍 32.2. 实现特点 32.3. 客户端接口 32.4. 服务器端函数 32.5. 例子程序 章33. ECPG - Embedded SQL in C 33.1. The Concept 33.2. Connecting to the Database Server 33.3. Closing a Connection 33.4. Running SQL Commands 33.5. Choosing a Connection 33.6. Using Host Variables 33.7. Dynamic SQL 33.8. pgtypes library 33.9. Using Descriptor Areas 33.10. Informix compatibility mode 33.11. Error Handling 33.12. Preprocessor directives 33.13. Processing Embedded SQL Programs 33.14. Library Functions 33.15. Internals 章34. 信息模式 34.1. 关于这个模式 34.2. 数据类型 34.3. information_schema_catalog_name 34.4. administrable_role_authorizations 34.5. applicable_roles 34.6. attributes 34.7. check_constraint_routine_usage 34.8. check_constraints 34.9. column_domain_usage 34.10. column_privileges 34.11. column_udt_usage 34.12. 字段 34.13. constraint_column_usage 34.14. constraint_table_usage 34.15. data_type_privileges 34.16. domain_constraints 34.18. domains 34.17. domain_udt_usage 34.19. element_types 34.20. enabled_roles 34.21. foreign_data_wrapper_options 34.22. foreign_data_wrappers 34.23. foreign_server_options 34.24. foreign_servers 34.25. key_column_usage 34.26. parameters 34.27. referential_constraints 34.28. role_column_grants 34.29. role_routine_grants 34.30. role_table_grants 34.31. role_usage_grants 34.32. routine_privileges 34.33. routines 34.34. schemata 34.35. sequences 34.36. sql_features 34.37. sql_implementation_info 34.38. sql_languages 34.39. sql_packages 34.40. sql_parts 34.41. sql_sizing 34.42. sql_sizing_profiles 34.43. table_constraints 34.44. table_privileges 34.45. tables 34.46. triggered_update_columns 34.47. 触发器 34.48. usage_privileges 34.49. user_mapping_options 34.50. user_mappings 34.51. view_column_usage 34.52. view_routine_usage 34.53. view_table_usage 34.54. 视图 V. 服务器端编程 章35. 扩展SQL 35.1. 扩展性是如何实现的 35.2. PostgreSQL类型系统 35.3. User-Defined Functions 35.4. Query Language (SQL) Functions 35.5. Function Overloading 35.6. Function Volatility Categories 35.7. Procedural Language Functions 35.8. Internal Functions 35.9. C-Language Functions 35.10. User-Defined Aggregates 35.11. User-Defined Types 35.12. User-Defined Operators 35.13. Operator Optimization Information 35.14. Interfacing Extensions To Indexes 35.15. 用C++扩展 章36. 触发器 36.1. 触发器行为概述 36.3. 用 C 写触发器 36.2. 数据改变的可视性 36.4. 一个完整的例子 章37. 规则系统 37.1. The Query Tree 37.2. 视图和规则系统 37.3. 在INSERT,UPDATE和DELETE上的规则 37.4. 规则和权限 37.5. 规则和命令状态 37.6. 规则与触发器得比较 章38. Procedural Languages 38.1. Installing Procedural Languages 章39. PL/pgSQL - SQL过程语言 39.1. 概述 39.2. PL/pgSQL的结构 39.3. 声明 39.4. 表达式 39.5. 基本语句 39.6. 控制结构 39.7. 游标 39.8. 错误和消息 39.9. 触发器过程 39.10. PL/pgSQL Under the Hood 39.11. 开发PL/pgSQL的一些提示 39.12. 从OraclePL/SQL 进行移植 章40. PL/Tcl - Tcl Procedural Language 40.1. Overview 40.2. PL/Tcl Functions and Arguments 40.3. Data Values in PL/Tcl 40.4. Global Data in PL/Tcl 40.5. Database Access from PL/Tcl 40.6. Trigger Procedures in PL/Tcl 40.7. Modules and the unknown command 40.8. Tcl Procedure Names 章41. PL/Perl - Perl Procedural Language 41.1. PL/Perl Functions and Arguments 41.2. Data Values in PL/Perl 41.3. Built-in Functions 41.4. Global Values in PL/Perl 41.6. PL/Perl Triggers 41.5. Trusted and Untrusted PL/Perl 41.7. PL/Perl Under the Hood 章42. PL/Python - Python Procedural Language 42.1. Python 2 vs. Python 3 42.2. PL/Python Functions 42.3. Data Values 42.4. Sharing Data 42.5. Anonymous Code Blocks 42.6. Trigger Functions 42.7. Database Access 42.8. Utility Functions 42.9. Environment Variables 章43. Server Programming Interface 43.1. Interface Functions Spi-spi-connect Spi-spi-finish Spi-spi-push Spi-spi-pop Spi-spi-execute Spi-spi-exec Spi-spi-execute-with-args Spi-spi-prepare Spi-spi-prepare-cursor Spi-spi-prepare-params Spi-spi-getargcount Spi-spi-getargtypeid Spi-spi-is-cursor-plan Spi-spi-execute-plan Spi-spi-execute-plan-with-paramlist Spi-spi-execp Spi-spi-cursor-open Spi-spi-cursor-open-with-args Spi-spi-cursor-open-with-paramlist Spi-spi-cursor-find Spi-spi-cursor-fetch Spi-spi-cursor-move Spi-spi-scroll-cursor-fetch Spi-spi-scroll-cursor-move Spi-spi-cursor-close Spi-spi-saveplan 43.2. Interface Support Functions Spi-spi-fname Spi-spi-fnumber Spi-spi-getvalue Spi-spi-getbinval Spi-spi-gettype Spi-spi-gettypeid Spi-spi-getrelname Spi-spi-getnspname 43.3. Memory Management Spi-spi-palloc Spi-realloc Spi-spi-pfree Spi-spi-copytuple Spi-spi-returntuple Spi-spi-modifytuple Spi-spi-freetuple Spi-spi-freetupletable Spi-spi-freeplan 43.4. Visibility of Data Changes 43.5. Examples VI. 参考手册 I. SQL命令 Sql-abort Sql-alteraggregate Sql-alterconversion Sql-alterdatabase Sql-alterdefaultprivileges Sql-alterdomain Sql-alterforeigndatawrapper Sql-alterfunction Sql-altergroup Sql-alterindex Sql-alterlanguage Sql-alterlargeobject Sql-alteroperator Sql-alteropclass Sql-alteropfamily Sql-alterrole Sql-alterschema Sql-altersequence Sql-alterserver Sql-altertable Sql-altertablespace Sql-altertsconfig Sql-altertsdictionary Sql-altertsparser Sql-altertstemplate Sql-altertrigger Sql-altertype Sql-alteruser Sql-alterusermapping Sql-alterview Sql-analyze Sql-begin Sql-checkpoint Sql-close Sql-cluster Sql-comment Sql-commit Sql-commit-prepared Sql-copy Sql-createaggregate Sql-createcast Sql-createconstraint Sql-createconversion Sql-createdatabase Sql-createdomain Sql-createforeigndatawrapper Sql-createfunction Sql-creategroup Sql-createindex Sql-createlanguage Sql-createoperator Sql-createopclass Sql-createopfamily Sql-createrole Sql-createrule Sql-createschema Sql-createsequence Sql-createserver Sql-createtable Sql-createtableas Sql-createtablespace Sql-createtsconfig Sql-createtsdictionary Sql-createtsparser Sql-createtstemplate Sql-createtrigger Sql-createtype Sql-createuser Sql-createusermapping Sql-createview Sql-deallocate Sql-declare Sql-delete Sql-discard Sql-do Sql-dropaggregate Sql-dropcast Sql-dropconversion Sql-dropdatabase Sql-dropdomain Sql-dropforeigndatawrapper Sql-dropfunction Sql-dropgroup Sql-dropindex Sql-droplanguage Sql-dropoperator Sql-dropopclass Sql-dropopfamily Sql-drop-owned Sql-droprole Sql-droprule Sql-dropschema Sql-dropsequence Sql-dropserver Sql-droptable Sql-droptablespace Sql-droptsconfig Sql-droptsdictionary Sql-droptsparser Sql-droptstemplate Sql-droptrigger Sql-droptype Sql-dropuser Sql-dropusermapping Sql-dropview Sql-end Sql-execute Sql-explain Sql-fetch Sql-grant Sql-insert Sql-listen Sql-load Sql-lock Sql-move Sql-notify Sql-prepare Sql-prepare-transaction Sql-reassign-owned Sql-reindex Sql-release-savepoint Sql-reset Sql-revoke Sql-rollback Sql-rollback-prepared Sql-rollback-to Sql-savepoint Sql-select Sql-selectinto Sql-set Sql-set-constraints Sql-set-role Sql-set-session-authorization Sql-set-transaction Sql-show Sql-start-transaction Sql-truncate Sql-unlisten Sql-update Sql-vacuum Sql-values II. 客户端应用程序 App-clusterdb App-createdb App-createlang App-createuser App-dropdb App-droplang App-dropuser App-ecpg App-pgconfig App-pgdump App-pg-dumpall App-pgrestore App-psql App-reindexdb App-vacuumdb III. PostgreSQL服务器应用程序 App-initdb App-pgcontroldata App-pg-ctl App-pgresetxlog App-postgres App-postmaster VII. 内部 章44. PostgreSQL内部概览 44.1. 查询路径 44.2. 连接是如何建立起来的 44.3. 分析器阶段 44.4. ThePostgreSQL规则系统 44.5. 规划器/优化器 44.6. 执行器 章45. 系统表 45.1. 概述 45.2. pg_aggregate 45.3. pg_am 45.4. pg_amop 45.5. pg_amproc 45.6. pg_attrdef 45.7. pg_attribute 45.8. pg_authid 45.9. pg_auth_members 45.10. pg_cast 45.11. pg_class 45.12. pg_constraint 45.13. pg_conversion 45.14. pg_database 45.15. pg_db_role_setting 45.16. pg_default_acl 45.17. pg_depend 45.18. pg_description 45.19. pg_enum 45.20. pg_foreign_data_wrapper 45.21. pg_foreign_server 45.22. pg_index 45.23. pg_inherits 45.24. pg_language 45.25. pg_largeobject 45.26. pg_largeobject_metadata 45.27. pg_namespace 45.28. pg_opclass 45.29. pg_operator 45.30. pg_opfamily 45.31. pg_pltemplate 45.32. pg_proc 45.33. pg_rewrite 45.34. pg_shdepend 45.35. pg_shdescription 45.36. pg_statistic 45.37. pg_tablespace 45.38. pg_trigger 45.39. pg_ts_config 45.40. pg_ts_config_map 45.41. pg_ts_dict 45.42. pg_ts_parser 45.43. pg_ts_template 45.44. pg_type 45.45. pg_user_mapping 45.46. System Views 45.47. pg_cursors 45.48. pg_group 45.49. pg_indexes 45.50. pg_locks 45.51. pg_prepared_statements 45.52. pg_prepared_xacts 45.53. pg_roles 45.54. pg_rules 45.55. pg_settings 45.56. pg_shadow 45.57. pg_stats 45.58. pg_tables 45.59. pg_timezone_abbrevs 45.60. pg_timezone_names 45.61. pg_user 45.62. pg_user_mappings 45.63. pg_views 章46. Frontend/Backend Protocol 46.1. Overview 46.2. Message Flow 46.3. Streaming Replication Protocol 46.4. Message Data Types 46.5. Message Formats 46.6. Error and Notice Message Fields 46.7. Summary of Changes since Protocol 2.0 47. PostgreSQL Coding Conventions 47.1. Formatting 47.2. Reporting Errors Within the Server 47.3. Error Message Style Guide 章48. Native Language Support 48.1. For the Translator 48.2. For the Programmer 章49. Writing A Procedural Language Handler 章50. Genetic Query Optimizer 50.1. Query Handling as a Complex Optimization Problem 50.2. Genetic Algorithms 50.3. Genetic Query Optimization (GEQO) in PostgreSQL 50.4. Further Reading 章51. 索引访问方法接口定义 51.1. 索引的系统表记录 51.2. 索引访问方法函数 51.3. 索引扫描 51.4. 索引锁的考量 51.5. 索引唯一性检查 51.6. 索引开销估计函数 章52. GiST Indexes 52.1. Introduction 52.2. Extensibility 52.3. Implementation 52.4. Examples 52.5. Crash Recovery 章53. GIN Indexes 53.1. Introduction 53.2. Extensibility 53.3. Implementation 53.4. GIN tips and tricks 53.5. Limitations 53.6. Examples 章54. 数据库物理存储 54.1. 数据库文件布局 54.2. TOAST 54.3. 自由空间映射 54.4. 可见映射 54.5. 数据库分页文件 章55. BKI后端接口 55.1. BKI 文件格式 55.2. BKI命令 55.3. 系统初始化的BKI文件的结构 55.4. 例子 章56. 规划器如何使用统计信息 56.1. 行预期的例子 VIII. 附录 A. PostgreSQL错误代码 B. 日期/时间支持 B.1. 日期/时间输入解析 B.2. 日期/时间关键字 B.3. 日期/时间配置文件 B.4. 日期单位的历史 C. SQL关键字 D. SQL Conformance D.1. Supported Features D.2. Unsupported Features E. Release Notes Release-0-01 Release-0-02 Release-0-03 Release-1-0 Release-1-01 Release-1-02 Release-1-09 Release-6-0 Release-6-1 Release-6-1-1 Release-6-2 Release-6-2-1 Release-6-3 Release-6-3-1 Release-6-3-2 Release-6-4 Release-6-4-1 Release-6-4-2 Release-6-5 Release-6-5-1 Release-6-5-2 Release-6-5-3 Release-7-0 Release-7-0-1 Release-7-0-2 Release-7-0-3 Release-7-1 Release-7-1-1 Release-7-1-2 Release-7-1-3 Release-7-2 Release-7-2-1 Release-7-2-2 Release-7-2-3 Release-7-2-4 Release-7-2-5 Release-7-2-6 Release-7-2-7 Release-7-2-8 Release-7-3 Release-7-3-1 Release-7-3-10 Release-7-3-11 Release-7-3-12 Release-7-3-13 Release-7-3-14 Release-7-3-15 Release-7-3-16 Release-7-3-17 Release-7-3-18 Release-7-3-19 Release-7-3-2 Release-7-3-20 Release-7-3-21 Release-7-3-3 Release-7-3-4 Release-7-3-5 Release-7-3-6 Release-7-3-7 Release-7-3-8 Release-7-3-9 Release-7-4 Release-7-4-1 Release-7-4-10 Release-7-4-11 Release-7-4-12 Release-7-4-13 Release-7-4-14 Release-7-4-15 Release-7-4-16 Release-7-4-17 Release-7-4-18 Release-7-4-19 Release-7-4-2 Release-7-4-20 Release-7-4-21 Release-7-4-22 Release-7-4-23 Release-7-4-24 Release-7-4-25 Release-7-4-26 Release-7-4-27 Release-7-4-28 Release-7-4-29 Release-7-4-3 Release-7-4-30 Release-7-4-4 Release-7-4-5 Release-7-4-6 Release-7-4-7 Release-7-4-8 Release-7-4-9 Release-8-0 Release-8-0-1 Release-8-0-10 Release-8-0-11 Release-8-0-12 Release-8-0-13 Release-8-0-14 Release-8-0-15 Release-8-0-16 Release-8-0-17 Release-8-0-18 Release-8-0-19 Release-8-0-2 Release-8-0-20 Release-8-0-21 Release-8-0-22 Release-8-0-23 Release-8-0-24 Release-8-0-25 Release-8-0-26 Release-8-0-3 Release-8-0-4 Release-8-0-5 Release-8-0-6 Release-8-0-7 Release-8-0-8 Release-8-0-9 Release-8-1 Release-8-1-1 Release-8-1-10 Release-8-1-11 Release-8-1-12 Release-8-1-13 Release-8-1-14 Release-8-1-15 Release-8-1-16 Release-8-1-17 Release-8-1-18 Release-8-1-19 Release-8-1-2 Release-8-1-20 Release-8-1-21 Release-8-1-22 Release-8-1-23 Release-8-1-3 Release-8-1-4 Release-8-1-5 Release-8-1-6 Release-8-1-7 Release-8-1-8 Release-8-1-9 Release-8-2 Release-8-2-1 Release-8-2-10 Release-8-2-11 Release-8-2-12 Release-8-2-13 Release-8-2-14 Release-8-2-15 Release-8-2-16 Release-8-2-17 Release-8-2-18 Release-8-2-19 Release-8-2-2 Release-8-2-20 Release-8-2-21 Release-8-2-3 Release-8-2-4 Release-8-2-5 Release-8-2-6 Release-8-2-7 Release-8-2-8 Release-8-2-9 Release-8-3 Release-8-3-1 Release-8-3-10 Release-8-3-11 Release-8-3-12 Release-8-3-13 Release-8-3-14 Release-8-3-15 Release-8-3-2 Release-8-3-3 Release-8-3-4 Release-8-3-5 Release-8-3-6 Release-8-3-7 Release-8-3-8 Release-8-3-9 Release-8-4 Release-8-4-1 Release-8-4-2 Release-8-4-3 Release-8-4-4 Release-8-4-5 Release-8-4-6 Release-8-4-7 Release-8-4-8 Release-9-0 Release-9-0-1 Release-9-0-2 Release-9-0-3 Release-9-0-4 F. 额外提供的模块 F.1. adminpack F.2. auto_explain F.3. btree_gin F.4. btree_gist F.5. chkpass F.6. citext F.7. cube F.8. dblink Contrib-dblink-connect Contrib-dblink-connect-u Contrib-dblink-disconnect Contrib-dblink Contrib-dblink-exec Contrib-dblink-open Contrib-dblink-fetch Contrib-dblink-close Contrib-dblink-get-connections Contrib-dblink-error-message Contrib-dblink-send-query Contrib-dblink-is-busy Contrib-dblink-get-notify Contrib-dblink-get-result Contrib-dblink-cancel-query Contrib-dblink-get-pkey Contrib-dblink-build-sql-insert Contrib-dblink-build-sql-delete Contrib-dblink-build-sql-update F.9. dict_int F.10. dict_xsyn F.11. earthdistance F.12. fuzzystrmatch F.13. hstore F.14. intagg F.15. intarray F.16. isn F.17. lo F.18. ltree F.19. oid2name F.20. pageinspect F.21. passwordcheck F.22. pg_archivecleanup F.23. pgbench F.24. pg_buffercache F.25. pgcrypto F.26. pg_freespacemap F.27. pgrowlocks F.28. pg_standby F.29. pg_stat_statements F.30. pgstattuple F.31. pg_trgm F.32. pg_upgrade F.33. seg F.34. spi F.35. sslinfo F.36. tablefunc F.37. test_parser F.38. tsearch2 F.39. unaccent F.40. uuid-ossp F.41. vacuumlo F.42. xml2 G. 外部项目 G.1. 客户端接口 G.2. 过程语言 G.3. 扩展 H. The Source Code Repository H.1. Getting The Source Via Git I. 文档 I.1. DocBook I.2. 工具集 I.3. 制作文档 I.4. 文档写作 I.5. 风格指导 J. 首字母缩略词 参考书目 Bookindex Index
文字

8.5. 日期/时间类型

Table 8-9显示了PostgreSQL支持的SQL中所有日期和时间类型。 这些数据类型上可以进行的操作在Section 9.9中描述。

Table 8-9. 日期/时间类型

名字 存储空间 描述 最低值 最高值 分辨率
timestamp [ (p) ] [ without time zone ] 8字节 日期和时间(无时区) 4713 BC 294276 AD 1毫秒/14位
timestamp [ (p) ] with time zone 8字节 日期和时间,带时区 4713 BC 294276 AD 1毫秒/14位
date 4字节 只用于日期 4713 BC 5874897 AD 1天
time [ (p) ] [ without time zone ] 8字节 只用于时间 00:00:00 24:00:00 1毫秒/14位
time [ (p) ] with time zone 12字节 只用于一日内时间,带时区 00:00:00+1459 24:00:00-1459 1毫秒/14位
interval [ fields ] [ (p) ] 12字节 时间间隔 -178000000年 178000000年 1毫秒/14位

Note: SQL标准要求仅仅将timestamp类型 等于timestamp without time zone类型,(7.3之前的版本将其看做timestamp with time zone

timetimestampinterval 接受一个可选的精度值p 以指明秒域中小数部分的位数。没有明确的缺省精度, p的范围对timestampinterval类型是从0到大约6。

Note: 如果timestamp数值是以双精度浮点数(目前的缺省)的方式存储的, 微秒的精度是可以通过全方位的价值观。当timestamp值存储为双精度浮点数(1过时的编译时间选项),那么有效精度会小于6。 timestamp值是以2000-01-01午夜之前或之后的秒数存储的, 而微秒的精度是为那些在2000-01-01前后几年的日期实现的,对于那些远一些的日子,精度会下降。 但当timestamp值是使用浮点实现数字,日期内取得几微秒精度。 请注意,在以浮点数存储的时候,随着时间间隔的增加,timestamp数值的精度会降低。 如上图所示:从公元前4713年至5874897 AD。

相同的编译时间选项也决定是否timeinterval值存储为 浮点数或8字节的整数。在浮点运算的情况下,大interval值降低 精密的间隔增加的大小。

对于time类型,如果使用了八字节的整数存储, 那么p允许的范围是从0到6, 如果使用的是浮点数存储,那么这个范围是0到10。

interval类型有一个额外的选项,用于通过写这些词组之一,限制存储领域;

YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND

需要注意的是,如果同时声明了fieldspfields必须包括SECOND,因为精度只适用于秒。

time with time zone类型是SQL标准定义的, 但是完整定义的有些方面会导致有问题的用法。 在大多数情况下,datetimetimestamp without time zonetimestamp with time zone的组合就应该 能提供一切应用需要的日期/时间的完整功能。

abstimereltime类型是低分辨率类型, 它们被用于系统内部。我们反对你使用这些类型, 因为这些旧类型的部分或全部可能会在未来的版本里消失。

8.5.1. 日期/时间输入

日期和时间的输入几乎可以是任何合理的格式, 包括 ISO-8601 格式、SQL-兼容格式、传统POSTGRES格式、其它的形式。 对于一些格式,日期输入里的月和日可能会让人迷惑, 因此系统支持自定义这些字段的顺序。 把DateStyle参数设置为MDY就按照"月-日-年"解析, 设置为DMY就按照"日-月-年"解析,设置为YMD就按照"年-月-日"解析。

PostgreSQL在处理日期/时间输入上 比SQL标准要求的更灵活。 参阅Appendix B获取关于日期/时间输入的 准确分析规则和可识别文本字段,包括月份、星期几、时区。

请记住任何日期或者时间的文本输入需要由单引号包围, 就像一个文本字符串一样。参考Section 4.1.2.7 获取更多信息。 SQL要求使用下面的语法:

type [ (p) ] 'value'

可选精度声明中的p是一个整数, 表示在秒域中小数部分的位数,我们可以对 time,timestamp,和interval类型声明精度。 允许的精度在上面已经说明。如果在常量声明中没有声明精度,缺省是文本值的精度。

8.5.1.1. 日期

Table 8-10显示了date类型可能的输入方式。

Table 8-10. 日期输入

例子 描述
1999-01-08 ISO 8601格式(建议格式),任何方式下都是1999年1月8号
January 8, 1999 在任何datestyle输入模式下都无歧义
1/8/1999 在MDY下是一月八号;在DMY模式下是八月一日
1/18/1999 MDY 模式下是一月十八日,其它模式下被拒绝
01/02/03 MDY模式下的2003年1月2日;DMY模式下的2003年2月1日;YMD模式下的2001年2月3日
1999-Jan-08 任何模式下都是1月8日
Jan-08-1999 任何模式下都是1月8日
08-Jan-1999 任何模式下都是1月8日
99-Jan-08 YMD模式下是1月8日,否则错误
08-Jan-99 一月八日,除了在YMD模式下是错误的之外
Jan-08-99 一月八日,除了在YMD模式下是错误的之外
19990108 ISO 8601;任何模式下都是1999年1月8日
990108 ISO 8601;任何模式下都是1999年1月8日
1999.008 年和年里的第几天
J2451187 儒略日
January 8, 99 BC 公元前99年

8.5.1.2. 时间

当日时间类型是time [ (p) ] without time zonetime [ (p) ] with time zone。 只写time等效于time without time zone

这些类型的有效输入由当日时间后面跟着可选的时区组成( 参阅Table 8-11和Table 8-12)。 如果在time without time zone类型的输入中声明了时区, 那么它会被悄悄地忽略。同样指定的日期也会被忽略, 除非使用了一个包括夏令时规则的时区名,比如 America/New_York,在这种情况下, 必须指定日期以确定这个时间是标准时间还是夏令时。 时区偏移将记录在time with time zone中。

Table 8-11. 时间输入

例子 描述
04:05:06.789 ISO 8601
04:05:06 ISO 8601
04:05 ISO 8601
040506 ISO 8601
04:05 AM 与04:05一样;AM不影响数值
04:05 PM 与16:05一样;输入小时数必须<=12
04:05:06.789-8 ISO 8601
04:05:06-08:00 ISO 8601
04:05-08:00 ISO 8601
040506-08 ISO 8601
04:05:06 PST 缩写的时区
2003-04-12 04:05:06 America/New_York 用名字声明的时区

Table 8-12. 时区输入

例子 描述
PST 太平洋标准时间(Pacific Standard Time)
America/New_York 完整时区名称
PST8PDT POSIX风格的时区
-8:00 ISO-8601与PST的偏移
-800 ISO-8601与PST的偏移
-8 ISO-8601与PST的偏移
zulu 军方对UTC的缩写
z zulu的缩写

参考Section 8.5.3以获取如何指定时区的更多信息。

8.5.1.3. 时间戳

时间戳类型的有效输入由一个日期和时间的连接组成, 后面跟着一个可选的时区,一个可选的ADBC。 另外,AD/BC可以出现在时区前面, 但这个顺序并非最佳的。因此

1999-01-08 04:05:06

和:

1999-01-08 04:05:06 -8:00

都是有效的数值,它是兼容 ISO-8601的。另外, 也支持下面这种使用广泛的格式;

January 8 04:05:06 1999 PST

被支持。

SQL标准通过"+"或者"-"是否 存在来区分timestamp without time zonetimestamp with time zone文本。因此,根据标准,

TIMESTAMP '2004-10-19 10:23:54'

是一个timestamp without time zone,而

TIMESTAMP '2004-10-19 10:23:54+02'

是一个timestamp with time zonePostgreSQL从来不会 在确定文本的类型之前检查文本内容, 因此会把上面两个都看做是timestamp without time zone。 因此要保证把上面的第二个当作timestamp without time zone看待, 就要给它明确的类型:

TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'

如果一个文本已被确定是timestamp without time zone, PostgreSQL将悄悄忽略任何文本中指出的时区。 因此,生成的日期/时间值是从输入值的日期/时间字段衍生出来的,并且没有就时区进行调整。

对于timestamp with time zone,内部存储的数值总是UTC(全球统一时间,以前也叫格林威治时间 GMT)。 如果一个输入值有明确的时区声明,那么它将用该时区合适的偏移量转换成 UTC 。 如果在输入字符串里没有时区声明, 那么它就假设是在系统的timezone参数里的那个时区,然后使用这个timezone时区转换成UTC。

如果输出一个timestamp with time zone,那么它总是从UTC转换成当前的timezone时区, 并且显示为该时区的本地时间。要看其它时区的该时间, 要么修改timezone, 要么使用AT TIME ZONE构造 (参阅Section 9.9.3)。

timestamp without time zonetimestamp with time zone之间的 转换通常假设timestamp without time zone数值应该以timezone本地时间的形式接受或者写出。 其它的时区引用可以用AT TIME ZONE的方式为转换声明。

8.5.1.4. 特殊值

PostgreSQL为方便起见支持在 Table 8-13里面显示的几个特殊输入值。 值infinity-infinity是特别在系统内部表示的, 并且将按照同样的方式显示;但是其它的都只是符号缩写, 在读取的时候将被转换成普通的日期/时间值。 特别是now和相关的字符串在读取的时候就被转换成对应的数值。 所有这些值在 SQL 命令里当作普通常量对待时,都需要写在单引号里面。

Table 8-13. 特殊日期/时间输入

输入字符串 适用类型 描述
epoch date, timestamp 1970-01-01 00:00:00+00 (UNIX系统零时)
infinity date, timestamp 比任何其它时间戳都晚
-infinity date, timestamp 比任何其它时间戳都早
now date, time, timestamp 当前事务的开始时间
today date, timestamp 今日午夜
tomorrow date, timestamp 明日午夜
yesterday date, timestamp 昨日午夜
allballs time 00:00:00.00 UTC

下列SQL兼容函数也可以用于获取对应数据类型的当前时间值: CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP, LOCALTIME,LOCALTIMESTAMP。 后四个接受一个可选的精度声明(Section 9.9.4)。不过, 请注意这些SQL函数不是被当作数据输入字符串识别的。

8.5.2. 日期/时间输入

日期/时间类型的输出格式设成 ISO 8601(默认)、SQL(Ingres)、 传统的POSTGRES(Unix date 格式)、German四种风格之一。 SQL标准要求使用ISO 8601格式。"SQL"输出格式的名字是历史偶然。 Table 8-14显示了每种输出风格的例子。 datetime类型的输出当然只是给出的例子里面的日期和时间部分。

Table 8-14. 日期/时间输入

风格 描述 例子
ISO ISO 8601/SQL标准 1997-12-17 07:37:16-08
SQL 传统风格 12/17/1997 07:37:16.00 PST
POSTGRES 原始风格 Wed Dec 17 07:37:16 1997 PST
German 地区风格 17.12.1997 07:37:16.00 PST

如果声明了DMY顺序,那么在SQL和POSTGRES风格里, 日期在月份之前出现,否则月份出现在日期之前(参阅Section 8.5.1看看这个设置如何影响对输入值的解释)。Table 8-15里有一个例子。

Table 8-15. 日期顺序习惯

datestyle设置 输入顺序 输入样例
SQL, DMY // 17/12/1997 15:37:16.00 CET
SQL, MDY // 12/17/1997 07:37:16.00 PST
Postgres, DMY day日/month月/year年 Wed 17 Dec 07:37:16 1997 PST

用户可以用SET datestyle命令选取日期/时间的风格, 也可以在配置文件postgresql.conf中的DateStyle参数中设置, 或者在服务器或客户端的PGDATESTYLE环境变量中设置。 我们也可以用格式化函数to_char(参见Section 9.8)来更灵活地控制时间/日期地输出。

8.5.3. 时区

时区和时区习惯不仅仅受地球几何形状的影响,还受到政治决定的影响。 到了19世纪,全球的时区变得稍微标准化了些,但是还是易于遭受随意的修改 ,部分是因为夏时制规则。PostgreSQL使用广泛 使用的zoneinfo时区信息数据库有关历史的时区规则。在未来,假设 是已知的对于一个给定的时区的最新规则会被继续无限期的遵守。

PostgreSQL在典型应用中尽可能与SQL的定义相兼容。 但SQL标准在日期/时间类型和功能上有一些奇怪的混淆。 两个显而易见的问题是:

  • date类型与时区没有联系,而time类型却有或可以有。 然而,现实世界的时区只有在与时间和日期都关联时才有意义, 因为时间偏移量(时差)可能因为实行类似夏时制这样的制度而在一年里有所变化。

  • 缺省的时区用一个数字常量表示与UTC的偏移(时差)。 因此,当跨DST(夏时制)界限做日期/时间算术时, 我们根本不可能把夏时制这样的因素计算进去。

为了克服这些困难,我们建议在使用时区的时候,使用那些同时包含日期和时间的日期/时间类型。 我们建议使用time with time zone类型( 尽管PostgreSQL出于合理应用以及为了与其它RDBMS兼容的考虑支持这个类型)。 PostgreSQL假设你用于 任何类型的本地时区都只包含日期或时间(而不包含时区)。

在系统内部,所有日期和时间都用全球统一时间UTC格式存储, 时间在发给客户前端前由数据库服务器根据timezone配置参数声明的时区转换成本地时间。

PostgreSQL允许使用三种方法指定时区:

  • 完整的时区名,例如America/New_York。 所有可以识别的时区名在pg_timezone_names视图中列出 (参见Section 45.60)。 PostgreSQL使用广泛使用的zoneinfo时区数据, 所以这些时区名在其它软件里也能被轻松的识别。

  • 时区缩写。例如PST。 这种缩写名通常只是定义了相对于UTC的偏移量, 而前一种完整的时区名可能还隐含着一组夏时制转换规则。 所有可以识别的时区缩写在pg_timezone_abbrevs视图中列出(参见Section 45.59)。 你不能使用时区缩写来设置timezone或log_timezone配置参数, 但是你可以在日期/时间输入值中结合AT TIME ZONE操作符使用时区缩写。

  • 除完整的时区名及其缩写之外,PostgreSQL还接受POSIX风格的STDoffsetSTDoffsetDST格式的时区, 其中的STD是时区缩写、offset是一个相对于UTC的小时偏移量、 DST是一个可选的夏时制时区缩写(假定相对于给定的偏移量提前一小时)。 例如,如果EST5EDT不是一个已识别的时区名,那么它将等同于美国东部时间。 如果存在夏时制时区名是当前时区名, 根据zoneinfo时区数据库的posixrules条目中相同的夏时制事务规则,可以考虑使用这个特性。 在一个PostgreSQL标准安装中, posixrulesUS/Eastern相同,因此POSIX格式的时区声明遵循USA夏时制规则。 如果需要,可以通过替换posixrules文件来调整该习惯。

总之,完整的时区名与时区缩写在理论与实践之间存在差异: 时区缩写总是代表一个相对于UTC的固定偏移量, 然而大多数完整的时区名隐含着一个本地夏令时规则, 因此就有可能有两个相对于UTC的不同偏移量。

需要警惕的是,由于没有合理的时区缩写检查,POSIX格式的时区特点能导致静默的伪输入。 例如,使用SET TIMEZONE TO FOOBAR0时,实际上系统使用的是一个很特别的UTC缩写。 另一个需要注意的是,在POSIX时区名中,积极的偏移用于west格林尼治位置。 在其他地方,PostgreSQL遵循ISO-8601规定,即积极的时区偏移east格林威治。

总体而言,PostgreSQL8.2版本以后时区名在所有情况下 都是大小写无关的。而之前的版本在某些情况下是大小写敏感的。

无论是完整的时区名还是时区缩写都不是硬连接进服务器的, 它们都是从安装目录下的.../share/timezone/.../share/timezonesets/配置文件中获取的(参见Section B.3)

可以在postgresql.conf文件里设置timezone配置参数, 或者用任何其它在Chapter 18描述的标准方法。除此之外, 还有好几种特殊方法可以设置它:

  • 如果既没有在postgresql.conf里也没有在命令行开关 上声明timezone,那么服务器将试图使用服务器主机上的TZ环境变量 作为服务器的缺省时区。 如果TZ没有定义或者是PostgreSQL不认识的时区名, 那么服务器将试图通过检查C库函数localtime()的行为来判断操作系统的缺省时区。 缺省时区是按照最接近PostgreSQL的已知时区的原则来选择的。 (如果没有指定,这些规则也可以用来选择默认值log_timezone)。

  • 使用SQL命令SET TIME ZONE为会话设置时区, 这是SET TIMEZONE TO的一个可选的拼写方式, 更加兼容标准。

  • 如果在客户端设置了PGTZ环境变量, 那么libpq在连接时将使用 这个环境变量给后端发送一个SET TIME ZONE命令。

8.5.4. 间隔输入

interval类型值可以用下面的详细语法写:

[@] quantity unit [quantity unit...] [direction]

这里quantity是一个数字(可能已标记); unit可以是microsecondmillisecondsecondminutehourdayweekmonthyeardecadecenturymillennium或这些单位的缩写或复数。 direction可以是ago或为空。@标记是可选的。ago否定所有。 如果IntervalStyle设置为postgres_verbose,那么这个语法同样用于间隔输入。

可以在没有明确单位标记的情况下声明天,小时,分钟和秒。 例如,'1 12:59:10'等同于'1 day 12 hours 59 min 10 sec'。 同样,可以用一个破折号来声明一个年和月的组合,例如'200-10'等同于'200 years 10 months'。 (事实上,SQL标准值允许短的格式,并且当 IntervalStyle设置为sql_standard时,用于输出)。

要么使用ISO 8601标准4.4.3.2的"format with designators",要么使用4.4.3.3的"alternative format",间隔值可以写为ISO 8601的时间间隔。 格式如下:

P quantity unit [ quantity unit ...] [ T [ quantity unit ...]]

字符串必须以P开始,并且可以含有一个T用以指明一天中时间的格式。 可用单位的缩写在Table 8-16有说明。 可以忽略单位,也可以以任意顺序声明,但单位小于一天时必须在T之后。 尤其M的含义依赖于它在T之前或之后。

Table 8-16. ISO8601间隔单位的缩写

缩写 含义
Y
M 月(日期部分)
W
D
H 小时
M 分钟(时间部分)
S

以缩写格式:

P [ years-months-days ] [ T hours:minutes:seconds ]

一个字符串必须以P开始,然后以T隔开日期和时间。 给出的值是如同ISO 8601日期的数字。

当用fields规范写一个时间间隔常熟,或将一个字符串标记为用fields规范定义的一个间隔柱时, 未标记单位的解释由fields解释。如INTERVAL '1' YEAR读作1年,然而INTERVAL '1'代表1秒。 同样,fields规范中最低有效字段值规定会被静默的忽略。如,INTERVAL '1 day 2:03:04' HOUR TO MINUTE会导致删除 秒字段,而不是天字段。

根据SQL标准,间隔值的所有字段必须有相同的符号,因此前导负号可以用于所有字段; 如'-1 2:03:04'中负号同时应用于天和小时/分钟/秒。 PostgreSQL允许字段有不同的标记,并且传统上,文本表述中的每个字段会被认为是独立标记的, 因此在这个例子中的小时/分钟/秒被认为是允许的。如果IntervalStyle被设置为sql_standard,那么前导标记被认为是应用于所有字段的 (当然前提是没有再出现其他标记),否则会使用传统的PostgreSQL解释。为了避免这种奇异,建议为每个字段附上一个明确的标记。

PostgreSQL内部,interval值被存储为月,日,秒的格式,这是因为月中包含天,并且如果进行了夏令时调整,那么一天可以有23或25小时。 当秒字段可以存储分数时,月和天字段可以是整数型。由于时间间隔通常是由常量字符串或timestamp减法来定义的, 这种存储方法在大多数情况下很有效。justify_daysjustify_hours函数可用于调整溢出正常范围值的天和小时。

在详细的输出格式,以及更紧凑的输入格式中,字段值可以有小数部分,例如'1.5 week''01:02:03.45'。 这种输入被转换成恰当的月,天和秒来存储。由于这样会产生小数的月或天,因此在低阶字段中引入了分数,用以1 month = 30 days 和 1 day = 24 hours的转换。 例如,'1.5 month'即1个月15天。输出中,只有秒可以写成分数形式。

Table 8-17中有一些有效的interval输入的例子。

Table 8-17. 间隔输入

示例 说明
1-2 SQL标准格式:一年两个月
3 4:05:06 SQL标准格式:3天4小时5分6秒
1 year 2 months 3 days 4 hours 5 minutes 6 seconds 传统Postgres格式: 1年2个月3天4小时5分钟6秒
P1Y2M3DT4H5M6S ISO 8601 "带标识符格式":与上面相同含义
P0001-02-03T04:05:06 ISO 8601 "缩写格式":与上面相同含义

8.5.5. 间隔输出

间隔类型的输出格式可以用命令SET intervalstyle设置为下面四种类型:sql_standardpostgrespostgres_verboseiso_8601 默认是postgres格式,Table 8-18中有每种格式的示例。

sql_standard格式产生的输出结果符合SQL的区间字符串标准, 如果间隔值满足标准的限制(无论年-月,或只有天-时间,没有积极和消极的构成的混合)。 否则类似一个标准年-月文本字符串后跟有一个天-时间文本字符串的输出,带有添加明确标记的消除歧义混合信号的时间间隔。

postgres格式的输出与PostgreSQL8.4(此时DateStyle参数设置为ISO)之前的输出是一致的。

postgres格式的输出与PostgreSQL8.4(此时DateStyle参数设置为非ISO输出)之前的输出是一致的

iso_8601格式的输出与ISO 8601标准4.4.3.2节中的"format with designators"一致。

Table 8-18. 间隔输出格式示例

格式 年-月区间 天-时间区间 混合区间
sql_standard 1-2 3 4:05:06 -1-2 +3 -4:05:06
postgres 1年2个月 3天04:05:06 -1年-2个月+3天-04:05:06
postgres_verbose @1年2个月 @3天4小时5分6秒 @1年2个月-3天4小时5分6秒以前
iso_8601 P1Y2M P3DT4H5M6S P-1Y-2M3DT-4H-5M-6S

8.5.6. 内部

PostgreSQL 使用儒略历法计算所有日期/时间, 假设一年的长度是365.2425天。这个方法可以很精确地预计/计算从公元前4713年到很久的未来的任意一天的日期。

19世纪以前的日期传统(历法)只是对一些趣味读物有意义, 而在我们这里好像没有充分的理由把它们编码入日期/时间控制器里面去。

上一篇: 下一篇: