目录 搜索
前言 何为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
文字

CREATE TABLE

Name

CREATE TABLE -- 定义一个新表

Synopsis

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [
  { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE parent_table [ like_option ... ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
    OF type_name [ (
  { column_name WITH OPTIONS [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]

这里的column_constraint是:

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) |
  UNIQUE index_parameters |
  PRIMARY KEY index_parameters |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

table_constraint是:

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) |
  UNIQUE ( column_name [, ... ] ) index_parameters |
  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
  EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

like_option是:

{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | ALL }

index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:

[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace ]

exclude_element in an EXCLUDE constraint is:

{ column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

描述

CREATE TABLE在当前数据库创建一个新的空白表。 该表将由发出此命令的用户所拥有。

如果给出了模式名(比如CREATE TABLE myschema.mytable ...), 那么在指定的模式中创建表,否则在当前模式中创建。临时表存在于一个特殊的模式里, 因此创建临时表的时候不能指定模式名。表名字必需在同一模式中的其它表、序列、索引、 视图名字中唯一。

CREATE TABLE还自动创建一个与该表的行对应的复合数据类型。因此, 表不能和同模式中的现有数据类型同名。

可选的约束子句声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 约束是一个SQL对象,它以多种方式协助在表上定义有效数值的集合。

定义约束有两种方法:表约束和列约束。列约束是作为一个列定义的一部分定义的。 而表约束并不和某个列绑在一起,它可以作用于多个列上。每个列约束也可以写成表约束; 如果某个约束只影响一个列,那么列约束只是符号上的简洁方式而已。

参数

TEMPORARY or TEMP

创建为临时表。临时表在会话结束或(可选)当前事务的结尾(参阅下面的ON COMMIT)自动删除。 除非用模式修饰的名字引用,否则现有的同名永久表在临时表存在期间,在本会话过程中是不可见的。 任何在临时表上创建的索引也都会被自动删除。

autovacuum daemon不能访问并且因此不能 清理或分析临时表。为此,适当的清理和分析操作应该通过会话SQL命令来执行。 例如,若一个临时表将要在复杂查询中使用,那么添加后在临时表中运行ANALYZE 是明智的。

可以选择在TEMPORARYTEMP前面放上 GLOBALLOCAL。 不过这对PostgreSQL来说没有任何区别,可以参阅 兼容性

table_name

要创建的表的名字(可以用模式修饰)

OF type_name

Creates a typed table, which takes its structure from the specified composite type (name optionally schema-qualified). A typed table is tied to its type; for example the table will be dropped if the type is dropped (with DROP TYPE ... CASCADE). 创建一个typed table,可以从指定的复合类型 中获取其结构(名称可以有模式修饰)。一个类型化的表与其类型相关; 例如表会在类型删除时被删除(有DROP TYPE ... CASCADE0)。

When a typed table is created, then the data types of the columns are determined by the underlying composite type and are not specified by the CREATE TABLE command. But the CREATE TABLE command can add defaults and constraints to the table and can specify storage parameters. 当一个typed表创建后,列的数据类型由根本的组成类型决定而且 不是由CREATE TABLE命令声明的。但是 CREATE TABLE命令可以添加默认值和约束到 表中,并能声明存储参数。

column_name

在新表中要创建的字段名字

data_type

该字段的数据类型。它可以包括数组说明符。 有关PostgreSQL支持的数据类型的更多信息, 请参考Chapter 8。

DEFAULT default_expr

DEFAULT子句给字段指定缺省值。该数值可以是任何不含 变量的表达式(不允许使用子查询和对本表中的其它字段的交叉引用)。 缺省表达式的数据类型必须和字段类型匹配。

缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有 指定缺省值则缺省值为NULL 。

INHERITS ( parent_table [, ... ] )

可选的INHERITS子句声明一系列的表,这个新表自动从 这一系列表中继承所有字段。

使用INHERITS将在子表和其父表之间创建一个永久的关系, 对父表结构的修改通常也会传播到子表。缺省时,扫描父表的时候也会 扫描子表。

如果在多个父表中存在同名字段,那么就会报告一个错误, 除非这些字段的数据类型在每个父表里都是匹配的。如果没有冲突, 那么重复的字段在新表中融合成一个字段。如果列出的新表字段名和继承字段同名, 那么它的数据类型也必须和继承字段匹配,并且这些字段定义会融合成一个。 如果新表为该字段明确声明了缺省值,那么此缺省值将覆盖任何继承字段的缺省值。 否则,该字段的所有父字段缺省值都必须相同,否则就会报错。

CHECK约束基本上以与列相同的方式合并。若多重父表和/或新表 定义包括同名的CHECK约束,那么这些约束必须都有相同的检查 表达式,或者将要报告的错误。有相同名称和表达式的约束将会合并到一个副 本中。注意:在新表中的一个未命名的CHECK约束将不会被合并, 因为一个唯一的名称总会被为此选择。

STORAGE设置也可以从父表中被复制。

LIKE parent_table [ like_option ... ]

LIKE子句声明一个表, 新表自动从这个表里面继承所有字段名及其数据类型和非空约束。

INHERITS不同,新表与原来的表之间在创建动作完毕之后是完全无关的。 在源表做的任何修改都不会传播到新表中, 并且也不可能在扫描源表的时候包含新表的数据。

字段缺省表达式只有在声明了INCLUDING DEFAULTS之后才会包含进来。 缺省是不包含缺省表达式的,结果是新表中所有字段的缺省值都是NULL 。

非空约束将总是复制到新表中,CHECK约束则仅在指定了INCLUDING CONSTRAINTS的时候才复制, 而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。

初始表上的任何索引都不能在新表上创建,除非INCLUDING INDEXES 子句被声明了。

INCLUDING STORAGE被声明,复制的列定义的 STORAGE设置将会被复制。默认响应是排除 STORAGE设置,导致新表中的复制列有特定类型的默认设置。 要获取更多关于STORAGE设置的细腻,请参阅 Section 54.2。

INCLUDING COMMENTS被声明,复制列的注释、 约束以及索引将会仅仅被复制。默认响应是排除注释,导致新表中的 复制列和约束没有注释。

INCLUDING ALLINCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING NDEXES INCLUDING STORAGE INCLUDING COMMENTS的缩写形式.

也要注意:不同于INHERITSLIKE 复制的列和索引不会与相近命名的列和约束合并。若相同的名称被明确 指定或者在另一个LIKE子句中,则会报错。

INHERITS不同, 列和被LIKE复制的约束并不使用相同的名字进行融合。 如果明确的指定了相同的名字或者在另外一个 LIKE子句中,那么将会报错。

CONSTRAINT constraint_name

可选的列约束或表约束的名字。如果约束本身是非法的,那么其名字将会出现在错误信息中, 因此像col must be positive这样的名字可以表达有用的约束信息。 如果约束名中含有空格则必须用双引号界定。如果没有指定约束名, 那么系统将会自动生成一个名字。

NOT NULL

字段不允许包含NULL值

NULL

字段允许包含NULL值,这是缺省。

这个子句的存在只是为和那些非标准SQL数据库兼容。不建议在新应用中使用它。

CHECK ( expression )

CHECK子句声明一个产生布尔结果的表达式,新的或者更新的 行为了成功必须满足插入或者更新操作。评估为TRUE或者UNKNOWN的表达式 成功。插入或者更新操作的任何行应该产生一个错误异常提出的FALSE结果 并且插入和更新吧改变数据库。一个声明为列约束的检查约束应该参照 列值唯一,尽管出现在一个表约束中的表达式可以参照多重表。

当前,CHECK表达式既不包括子查询,也不涉及变量 而不是当前行的列值。

UNIQUE (column constraint)
UNIQUE ( column_name [, ... ] ) (table constraint)

UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。 唯一约束的行为和列约束一样,只不过多了跨多行的能力。

对于唯一约束而言,NULL被认为是互不相等的。

每个唯一约束都必须给其使用的字段集合赋予一个与其它唯一约束 都不同的名字,并且也不能和主键约束的名字相同,否则就被认为 是同样的约束写了两次。

PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) (table constraint)

主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非NULL值。 从技术上讲,PRIMARY KEY只是UNIQUENOT NULL的组合, 不过把一套字段标识为主键同时也体现了模式设计的元数据, 因为主键意味着可以拿这套字段用做行的唯一标识。

一个表只能声明一个主键,不管是作为字段约束还是表约束。

主键约束使用的字段集合应该与其它唯一约束都不同。

EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ]

EXCLUDE子句定义一个排斥约束,这保证了若任意两行在 指定列或者使用指定操作符的表达式比较时,并非全部比较都会返回 TRUE。若所有指定操作符都测试相等性,这就等价于 UNIQUE约束,尽管一个普通的唯一性约束会更快一些。 然而,排除约束可以声明比简单的相等更常规的约束。例如,您可以 通过&&操作符声明一个约束使得表中的任意两 行都没有重叠的内容(参阅Section 8.8)。

排除约束通过使用索引来执行,因此每个声明的操作符必须与恰当的 操作符类联系(参阅Section 11.9)获取索引 访问方法index_method。操作符必须是可交换的。 每个exclude_element 可以选择制定一个操作符类和/或排序选项;这在 CREATE INDEX中有全面的描述。

访问方法必须支持amgettuple(参阅Chapter 51); 目前这意味着GIN不能被使用。尽管是允许的,但使用有排斥约束 的B-tree或hash索引的几乎没有任何意义,因为这能做的一个普通唯一性约束就 可以做的很好了。所以访问方法总会是GiST

predicate允许您在表的一个子集中声明一个 排除约束;这在内部创建了一个部分索引。请注意:为此必须用圆括号括起来。

REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)
FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)

这些子句声明一个外键约束,外键约束要求新表中一列或多列组成的组 应该只包含/匹配被参考的表中对应字段中的值。如果省略refcolumn,则使用 reftable的主键。 被参考字段必须是被参考表中的非延期唯一字段或者主键。 请注意,不能在临时表和永久表之间定义外键约束。

向参考字段插入的数值将使用给出的匹配类型与被参考表中被参考列的 数值进行匹配。有三种匹配类型:MATCH FULLMATCH PARTIALMATCH SIMPLE(缺省)。MATCH FULL不允许一个多字段 外键的字段为NULL ,除非所有外键字段都为NULL。 MATCH SIMPLE允许某些外键字段为NULL而外键的其它部 分不是NULL。MATCH PARTIAL目前尚未实现。

另外,当被参考字段中的数据改变的时候,那么将对本表的字段中的数据执行某种操作。 ON DELETE子句声明当被参考表中的被参考行被删除的时候要执行的操作。类似的, ON UPDATE子句声明被参考表中被参考字段更新为新值的时候要执行的动作。 如果该行被更新,但被参考的字段实际上没有变化,那么就不会有任何动作。 除了NO ACTION检查之外的其他参考动作都不能推迟,即使该约束声明为可推迟也是如此。 下面是每个子句的可能动作:

NO ACTION

生成一个错误,表明删除或更新将产生一个违反外键约束的动作。 如果该约束是可推迟的,并且如果还存在任何引用行, 那么这个错误将在检查约束的时候生成。这是缺省动作。

RESTRICT

生成一个表明删除或更新将导致违反外键约束的错误。 和NO ACTION一样,只是动作不可推迟。

CASCADE

删除任何引用了被删除行的行,或者分别把引用行的字段值更新 为被参考字段的新数值。

SET NULL

把引用行设置为NULL。

SET DEFAULT

把引用字段设置为它们的缺省值。

如果被参考字段经常更新,那么给外键字段增加一个索引可能是合适的, 这样与外键字段相关联的引用动作可以更有效地执行。

DEFERRABLE
NOT DEFERRABLE

这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。 可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。 缺省是NOT DEFERRABLE。 目前只有UNIQUEPRIMARY KEYEXCLUDEREFERENCES(外键)约束接受这个子句。 NOT NULLCHECK约束类型都是不可推迟的。

INITIALLY IMMEDIATE
INITIALLY DEFERRED

如果约束是可推迟的,那么这个子句声明检查约束的缺省时间。 如果约束是INITIALLY IMMEDIATE(缺省),那么每条语句之后就立即检查它。 如果约束是INITIALLY DEFERRED,那么只有在事务结尾才检查它。 约束检查的时间可以用SET CONSTRAINTS 命令修改。

WITH ( storage_parameter [= value] [, ... ] )

这个子句为表或指定一个可选的存储参数,参见存储参数获取更多信息。 用于表的WITH子句还可以包含OIDS=TRUE或单独的OIDS来指定给新表中的每一行都分配一个OID(对象标识符), 或者OIDS=FALSE表示不分配OID 。 如果没有指定OIDS默认行为取决于default_with_oids配置参数。 如果新表是从有OID的表继承而来, 那么即使明确指定OIDS=FALSE也将强制按照OIDS=TRUE 执行。

如果明确或隐含的指定了OIDS=FALSE,新表将不会存储OID,也不会为行分配OID。 这将减小OID的开销并因此延缓了32-bit OID计数器的循环。 因为一旦计数器发生循环之后OID将不能被视为唯一,这将大大降低OID的实用性。 另外,排除了OID的表也为每条记录减小了4字节的存储空间,从而可以稍微提升 一些性能。

可以使用ALTER TABLE从已有的表中删除OID列。

WITH OIDS
WITHOUT OIDS

这些是被废弃的、分别等价于WITH (OIDS)WITH (OIDS=FALSE)的语法。 WITH ( ... ) syntax;见上文。

ON COMMIT

使用ON COMMIT控制临时表在事务块结尾的行为。 这三个选项是:

PRESERVE ROWS

在事务结尾不采取任何特别的动作,这是缺省。

DELETE ROWS

删除临时表中的所有行。本质上是在每次提交事务后自动执行一个TRUNCATE命令。

DROP

删除临时表

TABLESPACE tablespace

tablespace是要创建新表的 表空间的名称,若未声明,则按照default_tablespace, 或者若表是临时的则按照temp_tablespaces。

指定新表将要在tablespace 表空间内创建。如果没有声明, 将查询default_tablespace ,如果表为空,那么将使用 temp_tablespaces。

USING INDEX TABLESPACE tablespace

该子句允许选择表空间的,在表空间中索引与UNIQUE, PRIMARY KEY,或者即将创建的EXCLUDE约束相关。若不声明, 则按照default_tablespace,或者若表是临时的就按照 temp_tablespaces。

这个子句允许选择与一个UNIQUEPRIMARY KEY约束相关的索引创建时所在的表空间。或者EXCLUDE限制将被创建。 如果没有声明,将查询default_tablespace, 如果表为空,那么将使用temp_tablespaces。

存储参数

WITH子句可以为表声明storage parameters,并且为与 UNIQUE,PRIMARY KEY,或者EXCLUDE 相关的索引。索引的存储参数记录在CREATE INDEX中。表目前可 用的存储参数在下面列出。对于每个擦安琥,除非指出,有一个有同名前缀 toast.的额外参数,这可以用于控制表的二级TOAST 表的性能,若有(参阅Section 54.2获取更多关于TOAST的信息)。 请注意:TOAST表继承来自其父表的autovacuum_*值,若没有设置 toast.autovacuum_*设置。

fillfactor (integer)

一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。 如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。 每个页上的剩余空间将用于在该页上更新行, 这就使得UPDATE有机会在同一页上放置同一条记录的新版本, 这比把新版本放置在其它页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择, 但是对于频繁更新的表,较小的填充因子则更加有效。此参数不能为TOAST表。

autovacuum_enabled, toast.autovacuum_enabled (boolean)

开启或者关闭在指定表上的autovacuum守护进程。若为真,autovacuum守护进程 将会开始一个在特定表上的VACUUM操作,当更新或者删除元组的数量 超过关系中现有元组的估计数目的autovacuum_vacuum_thresholdautovacuum_vacuum_scale_factor倍。类似的,当插入、更新或者 删除的元组超过关系中现有元组的估计数目autovacuum_analyze_thresholdautovacuum_analyze_scale_factor倍,则初始化一个 ANALYZE操作。若错误,该表将不会被自动清理,除了阻止 事务Id环绕式处理。参阅Section 23.1.4 获取更多关于阻止环绕式处理的信息。观察会发现该变量从autovacuum设置中继承其值。

autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)

初始换一个特定表上的VACUUM操作符之前, 更新或者删除元组的最小值。

autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (float4)

添加到autovacuum_vacuum_thresholdreltuples乘法器。

autovacuum_analyze_threshold (integer)

ANALYZE operation on a particular table. 在特定表中初始化一个ANALYZE操作之前,插入、更新 或者删除元组的最小值。

autovacuum_analyze_scale_factor (float4)

reltuples的乘法器要添加到 autovacuum_analyze_threshold

autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (integer)

Custom autovacuum_vacuum_cost_delay parameter.

autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)

Custom autovacuum_vacuum_cost_limit parameter.

autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)

自定义vacuum_freeze_min_age参数。 请注意autovacuum将会忽略尝试将一个每个表的 autovacuum_freeze_min_age设置的大于系统范围的 autovacuum_freeze_max_age设置的一半。

autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)

自定义autovacuum_freeze_max_age参数, 请注意:autovacuum将会忽略企图将每表 autovacuum_freeze_max_age设置得大于系统范围的设置 (它只能设置的更小)。请注意:当您能把autovacuum_freeze_max_age 设置的非常小时,或者甚至为0,这通常是不明智的,尽管这回强制频繁的 自动清理。

autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer)

自定义vacuum_freeze_table_age参数。

注意

不建议在新应用中使用OID,可能情况下, 更好的选择是使用一个SERIAL或者其它序列发生器做表的主键。 如果一个应用使用了OID标识表中的特定行,那么建议在该表的oid字段上创建一个唯一约束, 以确保该表的OID即使在计数器循环之后也是唯一的。 如果你需要一个整个数据库范围的唯一标识,那么就要避免假设OID是跨表唯一的, 你可以用tableoid和行OID的组合来实现这个目的。

Tip: 对那些没有主键的表,不建议使用OIDS=FALSE,因为如果既没有OID又没有唯一数据字段, 那么就很难标识特定的行。

PostgreSQL自动为每个唯一约束和主键约束创建一个索引以确保其唯一性。 因此,不必为主键字段明确的创建索引。 参阅 CREATE INDEX获取更多信息。

唯一约束和主键在目前的实现里是不能继承的。如果把继承和唯一约束组合在一起会导致无法运转。

一个表不能超过1600个字段。实际的限制比这个更低,因为还有元组长度限制。

例子

创建filmsdistributors表:

CREATE TABLE films (
    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
);

CREATE TABLE distributors (
     did    integer PRIMARY KEY DEFAULT nextval('serial'),
     name   varchar(40) NOT NULL CHECK (name <> '')
);

创建一个带有2维数组的表:

CREATE TABLE array_int (
    vector  int[][]
);

为表films定义一个唯一表约束。唯一表约束可以在表的一个或多个字段上定义:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT production UNIQUE(date_prod)
);

定义一个检查列约束:

CREATE TABLE distributors (
    did     integer CHECK (did > 100),
    name    varchar(40)
);

定义一个检查表约束:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40)
    CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);

为表films定义一个主键表约束。

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);

为表distributors定义一个主键约束。 下面两个例子是等效的,第一个例子使用了表约束语法,第二个使用了列约束语法。

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    PRIMARY KEY(did)
);

CREATE TABLE distributors (
    did     integer PRIMARY KEY,
    name    varchar(40)
);

下面这个例子给字段name赋予了一个文本常量缺省值, 并且将字段did的缺省值安排为通过选择序列对象的下一个值生成。 modtime的缺省值将是该行插入的时间戳。

CREATE TABLE distributors (
    name      varchar(40) DEFAULT 'Luso Films',
    did       integer DEFAULT nextval('distributors_serial'),
    modtime   timestamp DEFAULT current_timestamp
);

在表distributors上定义两个NOT NULL列约束, 其中之一明确给出了名字:

CREATE TABLE distributors (
    did     integer CONSTRAINT no_null NOT NULL,
    name    varchar(40) NOT NULL
);

name字段定义一个唯一约束:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);

上面的和下面这样作为一个表约束声明是一样的:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name)
);

创建同样的表,并为表以及唯一索引指定70%率:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);

创建有排斥约束的表circles,排斥约束可以阻止 任意两个范围重合:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);

在表空间diskvol1里创建cinemas表:

CREATE TABLE cinemas (
        id serial,
        name text,
        location text
) TABLESPACE diskvol1;

创建一个复合类型和一个类型化表:

CREATE TYPE employee_type AS (name text, salary numeric);

CREATE TABLE employees OF employee_type (
    PRIMARY KEY (name),
    salary WITH OPTIONS DEFAULT 1000
);

兼容性

CREATE TABLE遵循SQL标准, 一些例外情况在下面列出。

临时表

尽管CREATE TEMPORARY TABLE的语法和SQL标准的类似, 但是效果是不同的。在标准里,临时表只是定义一次并且从空内容开始自动存在于任何需要它们的会话中。 PostgreSQL要求每个会话为它们使用的每个临时表发出它们自己的 CREATE TEMPORARY TABLE 命令。 这样就允许不同的会话将相同的临时表名字用于不同的目的, 而标准的实现方法则把一个临时表名字约束为具有相同的表结构。

标准定义的临时表的行为被广泛地忽略了。PostgreSQL在这方面上的行为类似于许多其它SQL数据库系统。

标准中的全局和局部临时表之间的区别在PostgreSQL里不存在, 因为这种区别取决于模块的概念,而PostgreSQL没有这个概念。 出于兼容考虑,PostgreSQL将接受临时表声明中的GLOBALLOCAL关键字, 但是他们没有任何作用。

临时表的ON COMMIT子句也类似于SQL标准,但是有些区别。 如果忽略了ON COMMIT子句,SQL标准声明缺省的行为是ON COMMIT DELETE ROWS。 但是PostgreSQL里的缺省行为是ON COMMIT PRESERVE ROWS。 在SQL标准里不存在ON COMMIT DROP选项。

非递延惟一性约束

当一个UNIQUE或者PRIMARY KEY约束未延期, PostgreSQL每当已插入或者更改列时就会 检查唯一性。SQL标准要求仅在语句末强制唯一性;但这有时会有变化,例如 一个单独的命令更新多个关键值的情况。要获得遵循标准的行为,须声明 约束为DEFERRABLE但不延期(例如:INITIALLY IMMEDIATE)。请注意,这明显慢于直接唯一性检查。

列检查约束

SQL标准说CHECK列约束只能引用他们作用的字段; 只有CHECK表约束才能引用多个字段。 PostgreSQL并不强制这个限制;它把字段和表约束看作相同的东西。

EXCLUDE Constraint

EXCLUDE约束类型是一个 PostgreSQL扩展。

NULL "约束"

NULL"约束"(实际上不是约束)是PostgreSQL对SQL标准的扩展, 包括它是为了和其它一些数据库系统兼容以及为了和NOT NULL约束对称。因为它是任何字段的缺省,所以它的出现 是没有意义的。

继承

通过INHERITS子句的多重继承是PostgreSQL语言的扩展。 SQL:1999及以后的标准使用不同的语法和语义定义了单继承。SQL:1999风格的继承还没有在 PostgreSQL中实现。

零字段表

PostgreSQL允许创建没有字段的表(比如CREATE TABLE foo();)。这是对SQL标准的扩展, 标准不允许存在零字段表。零字段表本身没什么用, 但是禁止他们会给ALTER TABLE DROP COLUMN带来很奇怪的情况,所以, 这个时候忽视标准的限制概念非常清楚。

WITH子句

WITH子句是PostgreSQL的扩展, 同样,存储参数和OID也是扩展。

表空间

PostgreSQL的表空间概念不是标准的东西。 因此TABLESPACEUSING INDEX TABLESPACE都是扩展。

Typed Tables

类型化表执行SQL标准的一个子集。根据标准,一个类型化表有与底层复合类型 以及另一个是"self-referencing column"的列相符合的列。 PostgreSQL明确不支持这些自参照列,但是在使用OID特性时会有相同的效果。

又见

ALTER TABLE, DROP TABLE, CREATE TABLESPACE, CREATE TYPE
上一篇: 下一篇: