I. 教程
II. SQL 语言
III. 服务器管理
- 章14. 安装指导
- 章15. 在 Windows 上安装客户端
- 章16. 操作系统环境
- 章17. 服务器配置
- 章18. 数据库角色和权限
- 章19. 管理数据库
- 章21. 区域
- 章20. 用户认证
- 章22. 日常数据库维护工作
- 章23. 备份与恢复
- 章24. 高可用性与负载均衡
- 章25. 监控数据库的活动
- 章26. 监控磁盘使用情况
- 章27. 可靠性和预写式日志
- 章28. 回归测试
IV. 客户端接口
- Chapter 28. libpq - C 库
- 章29.
- Chapter 30. ecpg - 在 C 里嵌入 SQL
- Chapter 31. 信息模式
- 31.2. 数据类型
- 31.3. informationschemacatalog_name
- 31.4. applicable_roles
- 31.5. check_constraints
- 31.6. columndomainusage
- 31.7. column_privileges
- 31.8. columnudtusage
- 31.9. columns
- 31.10. constraintcolumnusage
- 31.11. constrainttableusage
- 31.12. datatypeprivileges
- 31.13. domain_constraints
- 31.14. domainudtusage
- 31.15. domains
- 31.16. element_types
- 31.17. enabled_roles
- 31.18. keycolumnusage
- 31.20. referential_constraints
- 31.21. rolecolumngrants
- 31.22. roleroutinegrants
- 31.23. roletablegrants
- 31.24. roleusagegrants
- 31.25. routine_privileges
- 31.26. routines
- 31.27. schemata
- 31.28. sql_features
- 31.29. sqlimplementationinfo
- 31.30. sql_languages
- 31.31. sql_packages
- 31.32. sql_sizing
- 31.33. sqlsizingprofiles
- 31.34. table_constraints
- 31.35. table_privileges
- 31.36. tables
- 31.37. triggers
- 31.38. usage_privileges
- 31.39. viewcolumnusage
- 31.40. viewtableusage
- 31.41. views
V. 服务器端编程
- 章33. 扩展 SQL
- 章34. 触发器
- 章35. 规则系统
- 章36. 过程语言
- 章37. PL/pgSQL - SQL 过程语言
- 章38. PL/Tcl - Tcl 过程语言
- 章39. PL/Perl - Perl 过程语言
- 章40. PL/Python - Python 过程语言
- 章41. 服务器编程接口
VI. 参考手册
- I. SQL 命令
- ABORT
- ALTER AGGREGATE
- ALTER CONVERSION
- ALTER DATABASE
- ALTER DOMAIN
- ALTER FUNCTION
- ALTER GROUP
- ALTER INDEX
- ALTER LANGUAGE
- ALTER OPERATOR
- ALTER OPERATOR CLASS
- ALTER ROLE
- ALTER SCHEMA
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TABLESPACE
- ALTER TRIGGER
- ALTER TYPE
- ALTER USER
- ANALYZE
- BEGIN
- CHECKPOINT
- CLOSE
- CLUSTER
- COMMENT
- COMMIT PREPARED
- COMMIT
- COPY
- CREATE AGGREGATE
- CREATE CAST
- CREATE CONSTRAINT TRIGGER
- CREATE CONVERSION
- CREATE DATABASE
- CREATE DOMAIN
- CREATE FUNCTION
- CREATE GROUP
- CREATE INDEX
- CREATE LANGUAGE
- CREATE OPERATOR CLASS
- CREATE OPERATOR
- CREATE ROLE
- CREATE RULE
- CREATE SCHEMA
- CREATE SEQUENCE
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLESPACE
- CREATE TRIGGER
- CREATE TYPE
- CREATE USER
- CREATE VIEW
- DEALLOCATE
- DECLARE
- DELETE
- DROP OWNED
- DROP AGGREGATE
- DROP CAST
- DROP CONVERSION
- DROP DATABASE
- DROP DOMAIN
- DROP FUNCTION
- DROP GROUP
- DROP INDEX
- DROP LANGUAGE
- DROP OPERATOR CLASS
- DROP OPERATOR
- DROP ROLE
- DROP RULE
- DROP SCHEMA
- DROP SEQUENCE
- DROP TABLE
- DROP TABLESPACE
- DROP TRIGGER
- DROP TYPE
- DROP USER
- DROP VIEW
- END
- EXECUTE
- EXPLAIN
- FETCH
- GRANT
- INSERT
- LISTEN
- LOAD
- LOCK
- MOVE
- NOTIFY
- PREPARE TRANSACTION
- PREPARE
- REASSIGN OWNED
- REINDEX
- RELEASE SAVEPOINT
- RESET
- REVOKE
- ROLLBACK PREPARED
- ROLLBACK TO SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT
- SELECT INTO
- SET
- SET CONSTRAINTS
- SET ROLE
- SET SESSION AUTHORIZATION
- SET TRANSACTION
- SHOW
- START TRANSACTION
- TRUNCATE
- UNLISTEN
- UPDATE
- VACUUM
- II. PostgreSQL 客户端应用程序
- III. PostgreSQL 服务器应用程序
VII. 内部
- 章42. PostgreSQL 内部概貌
- 章43. 系统表
- 43.1. 概述
- 43.2. pg_aggregate
- 43.3. pg_am
- 43.4. pg_amop
- 43.5. pg_amproc
- 43.6. pg_attrdef
- 43.7. pg_attribute
- 43.8. pg_authid
- 43.9. pgauthmembers
- 43.10. pg_autovacuum
- 43.11. pg_cast
- 43.12. pg_class
- 43.13. pg_constraint
- 43.14. pg_conversion
- 43.15. pg_database
- 43.16. pg_depend
- 43.17. pg_description
- 43.18. pg_index
- 43.19. pg_inherits
- 43.20. pg_language
- 43.21. pg_largeobject
- 43.22. pg_listener
- 43.23. pg_namespace
- 43.24. pg_opclass
- 43.25. pg_operator
- 43.26. pg_pltemplate
- 43.27. pg_proc
- 43.28. pg_rewrite
- 43.29. pg_shdepend
- 43.30. pg_shdescription
- 43.31. pg_statistic
- 43.32. pg_tablespace
- 43.33. pg_trigger
- 43.34. pg_type
- 43.35. 系统视图
- 43.36. pg_cursors
- 43.37. pg_group
- 43.38. pg_indexes
- 43.39. pg_locks
- 43.40. pgpreparedstatements
- 43.41. pgpreparedxacts
- 43.42. pg_roles
- 43.43. pg_rules
- 43.44. pg_settings
- 43.45. pg_shadow
- 43.46. pg_stats
- 43.47. pg_tables
- 43.48. pgtimezoneabbrevs
- 43.49. pgtimezonenames
- 43.50. pg_user
- 43.51. pg_views
- 章44. 前/后端协议
- 章45. PostgreSQL 编码约定
- 章46. 本地语言支持
- 章47. 书写一个过程语言处理器
- 章48. 基因查询优化器
- 章49. 索引访问方法接口定义
- 章50. GiST 索引
- 章51. GIN 索引
- 章52. 数据库物理存储
- 章53. BKI 后端接口
- 章54. 规划器如何使用统计信息
VIII. 附录
CREATE TABLE
名称
CREATE TABLE--定义一个新表语法
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLEtable_name
( [ {column_name
data_type
[ DEFAULTdefault_expr
] [column_constraint
[ ... ] ] |table_constraint
| LIKEparent_table
[ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS } ] ... } [, ... ] ] ) [ INHERITS (parent_table
[, ... ] ) ] [ WITH (storage_parameter
[=value
] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEtablespace
] 这里的column_constraint
是: [ CONSTRAINTconstraint_name
] { NOT NULL | NULL | UNIQUEindex_parameters
| PRIMARY KEYindex_parameters
| CHECK (expression
) | REFERENCESreftable
[ (refcolumn
) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEaction
] [ ON UPDATEaction
] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 而table_constraint
是: [ CONSTRAINTconstraint_name
] { UNIQUE (column_name
[, ... ] )index_parameters
| PRIMARY KEY (column_name
[, ... ] )index_parameters
| CHECK (expression
) | FOREIGN KEY (column_name
[, ... ] ) REFERENCESreftable
[ (refcolumn
[, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEaction
] [ ON UPDATEaction
] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 在UNIQUE
和PRIMARY KEY
约束中的index_parameters
是: [ WITH (storage_parameter
[=value
] [, ... ] ) ] [ USING INDEX TABLESPACEtablespace
]
描述
CREATE TABLE
在当前数据库创建一个新的空白表。该表将由发出此命令的用户所拥有。
如果给出了模式名(比如 CREATE TABLE myschema.mytable ...
),那么在指定的模式中创建表,否则在当前模式中创建。临时表存在于一个特殊的模式里,因此创建临时表的时候不能指定模式名。表名字必需在同一模式中的其它表、序列、索引、视图名字中唯一。
CREATE TABLE
还自动创建一个与该表的行对应的复合数据类型。因此,表不能和同模式中的现有数据类型同名。
可选的约束子句声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。约束是一个 SQL 对象,它以多种方式协助在表上定义有效数值的集合。
定义约束有两种方法:表约束和列约束。列约束是作为一个列定义的一部分定义的。而表约束并不和某个列绑在一起,它可以作用于多个列上。每个列约束也可以写成表约束;如果某个约束只影响一个列,那么列约束只是符号上的简洁方式而已。
参数
TEMPORARY
或TEMP
创建为临时表。临时表在会话结束或(可选)当前事务的结尾(参阅下面的
ON COMMIT
)自动删除。除非用模式修饰的名字引用,否则现有的同名永久表在临时表存在期间,在本会话过程中是不可见的。任何在临时表上创建的索引也都会被自动删除。可以选择在
。TEMPORARY
或TEMP
前面放上GLOBAL
或LOCAL
。不过这对 PostgreSQL 来说没有任何区别,可以参阅兼容性table_name
要创建的表的名字(可以用模式修饰)
column_name
在新表中要创建的字段名字
data_type
该字段的数据类型。它可以包括数组说明符。有关 PostgreSQL 支持的数据类型的更多信息,请参考章8。
DEFAULT
default_expr
DEFAULT
子句给字段指定缺省值。该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其它字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为 NULL 。
INHERITS (
parent_table
[, ... ] )可选的
INHERITS
子句声明一系列的表,这个新表自动从这一系列表中继承所有字段。使用
INHERITS
将在子表和其父表之间创建一个永久的关系,对父表结构的修改通常也会传播到子表。缺省时,扫描父表的时候也会扫描子表。如果在多个父表中存在同名字段,那么就会报告一个错误,除非这些字段的数据类型在每个父表里都是匹配的。如果没有冲突,那么重复的字段在新表中融合成一个字段。如果列出的新表字段名和继承字段同名,那么它的数据类型也必须和继承字段匹配,并且这些字段定义会融合成一个。不过,新字段可以声明不同于同名继承字段的约束:所有继承过来的约束以及新声明的约束都融合到一起,并且同时作用于新表。如果新表为该字段明确声明了缺省值,那么此缺省值将覆盖任何继承字段的缺省值。否则,该字段的所有父字段缺省值都必须相同,否则就会报错。
LIKE
parent_table
[ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS } ]LIKE
子句声明一个表,新表自动从这个表里面继承所有字段名及其数据类型和非空约束。和
INHERITS
不同,新表与原来的表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。字段缺省表达式只有在声明了
INCLUDING DEFAULTS
之后才会包含进来。缺省是不包含缺省表达式的,结果是新表中所有字段的缺省值都是 NULL 。非空约束将总是复制到新表中,
CHECK
约束则仅在指定了INCLUDING CONSTRAINTS
的时候才复制,而其他类型的约束则永远也不会被复制。此规则同时适用于表约束和列约束。和
INHERITS
不同,被复制的列和约束并不使用相同的名字进行融合。如果明确的指定了相同的名字或者在另外一个LIKE
子句中,那么将会报错。CONSTRAINT
constraint_name
可选的列约束或表约束的名字。如果约束本身是非法的,那么其名字将会出现在错误信息中,因此像
col must be positive
这样的名字可以表达有用的约束信息。如果约束名中含有空格则必须用双引号界定。如果没有指定约束名,那么系统将会自动生成一个名字。NOT NULL
字段不允许包含 NULL 值
NULL
字段允许包含 NULL 值,这是缺省。
这个子句的存在只是为和那些非标准 SQL 数据库兼容。不建议在新应用中使用它。
UNIQUE
(column constraint)UNIQUE (
(table constraint)column_name
[, ... ] )UNIQUE
约束表示表里的一个或多个字段的组合必须在全表范围内唯一。唯一约束的行为和列约束一样,只不过多了跨多行的能力。对于唯一约束而言,NULL 被认为是互不相等的。
每个唯一约束都必须给其使用的字段集合赋予一个与其它唯一约束都不同的名字,并且也不能和主键约束的名字相同,否则就被认为是同样的约束写了两次。
PRIMARY KEY
(column constraint)PRIMARY KEY (
(table constraint)column_name
[, ... ] )主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非 NULL 值。从技术上讲,
PRIMARY KEY
只是UNIQUE
和NOT NULL
的组合,不过把一套字段标识为主键同时也体现了模式设计的元数据,因为主键意味着可以拿这套字段用做行的唯一标识。一个表只能声明一个主键,不管是作为字段约束还是表约束。
主键约束使用的字段集合应该与其它唯一约束都不同。
CHECK (
expression
)CHECK
约束声明一个生成布尔结果的表达式,每次将要插入的新行或者将要被更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。目前,
CHECK
表达式不能包含子查询也不能引用除当前行字段之外的变量。REFERENCES
(column constraint)reftable
[ (refcolumn
) ] [ MATCHmatchtype
] [ ON DELETEaction
] [ ON UPDATEaction
]FOREIGN KEY (
(table constraint)column
[, ... ] ) REFERENCESreftable
[ (refcolumn
[, ... ] ) ] [ MATCHmatchtype
] [ ON DELETEaction
] [ ON UPDATEaction
]这些子句声明一个外键约束,外键约束要求新表中一列或多列组成的组应该只包含/匹配被参考的表中对应字段中的值。如果省略
refcolumn
,则使用reftable
的主键。被参考字段必须是被参考表中的唯一字段或者主键。请注意,不能在临时表和永久表之间定义外键约束。向参考字段插入的数值将使用给出的匹配类型与被参考表中被参考列的数值进行匹配。有三种匹配类型:
MATCH FULL
,MATCH PARTIAL
,MATCH 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
。目前只有外键约束接受这个子句。所有其它约束类型都是不可推迟的。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)
的语法。ON COMMIT
控制临时表在事务块结尾的行为。这三个选项是:
PRESERVE ROWS
不采取任何特别的动作,这是缺省。
DELETE ROWS
删除临时表中的所有行。本质上是在每次提交事务后自动执行一个 TRUNCATE 命令。
DROP
删除临时表
TABLESPACE
tablespace
指定新表将要在
tablespace
表空间内创建。如果没有声明,将使用 default_tablespace ,如果default_tablespace
为空,那么将使用数据库的缺省表空间。USING INDEX TABLESPACE
tablespace
这个子句允许选择与一个
UNIQUE
或PRIMARY KEY
约束相关的索引创建时所在的表空间。如果没有提供这个子句,这个索引将在 default_tablespace 中创建,如果default_tablespace
为空,那么将使用数据库的缺省表空间。
存储参数
WITH
子句可以为表指定存储参数,并在索引上创建 UNIQUE
或 PRIMARY KEY
约束。用于索引的存储参数在 CREATE INDEX 里面描述。目前唯一一个可以在表上使用的存储参数是:
FILLFACTOR
一个表的填充因子(fillfactor)是一个介于 10 和 100 之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,
INSERT
操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE
有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其它页上更有效。对于一个从不更新的表将填充因子设为 100 是最佳选择,但是对于频繁更新的表,较小的填充因子则更加有效。
注意
不建议在新应用中使用 OID ,可能情况下,更好的选择是使用一个 SERIAL
或者其它序列发生器做表的主键。如果一个应用使用了 OID 标识表中的特定行,那么建议在该表的 oid
字段上创建一个唯一约束,以确保该表的 OID 即使在计数器循环之后也是唯一的。如果你需要一个整个数据库范围的唯一标识,那么就要避免假设 OID 是跨表唯一的,你可以用 tableoid
和行 OID 的组合来实现这个目的。
【提示】对那些没有主键的表,不建议使用
OIDS=FALSE
,因为如果既没有 OID 又没有唯一数据字段,那么就很难标识特定的行。
PostgreSQL 自动为每个唯一约束和主键约束创建一个索引以确保其唯一性。因此,不必为主键字段明确的创建索引。参阅 CREATE INDEX 获取更多信息。
唯一约束和主键在目前的实现里是不能继承的。如果把继承和唯一约束组合在一起会导致无法运转。
一个表不能超过 1600 个字段。实际的限制比这个更低,因为还有元组长度限制。
例子
创建 films
和 distributors
表:
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);
在表空间 diskvol1
里创建 cinemas
表:
CREATE TABLE cinemas ( id serial, name text, location text ) TABLESPACE diskvol1;
兼容性
CREATE TABLE
遵循 SQL 标准,一些例外情况在下面列出。
临时表
尽管 CREATE TEMPORARY TABLE
的语法和 SQL 标准的类似,但是效果是不同的。在标准里,临时表只是定义一次并且从空内容开始自动存在于任何需要它们的会话中。PostgreSQL 要求每个会话为它们使用的每个临时表发出它们自己的 CREATE TEMPORARY TABLE
命令。这样就允许不同的会话将相同的临时表名字用于不同的目的,而标准的实现方法则把一个临时表名字约束为具有相同的表结构。
标准定义的临时表的行为被广泛地忽略了。PostgreSQL 在这方面上的行为类似于许多其它 SQL 数据库系统。
标准中的全局和局部临时表之间的区别在 PostgreSQL 里不存在,因为这种区别取决于模块的概念,而 PostgreSQL 没有这个概念。出于兼容考虑,PostgreSQL 将接受临时表声明中的 GLOBAL
和 LOCAL
关键字,但是他们没有任何作用。
临时表的 ON COMMIT
子句也类似于 SQL 标准,但是有些区别。如果忽略了 ON COMMIT
子句,SQL 标准声明缺省的行为是 ON COMMIT DELETE ROWS
。但是 PostgreSQL 里的缺省行为是 ON COMMIT PRESERVE ROWS
。在 SQL 标准里不存在 ON COMMIT DROP
选项。
列检查约束
SQL 标准说 CHECK
列约束只能引用他们作用的字段;只有 CHECK
表约束才能引用多个字段。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 的表空间概念不是标准的东西。因此 TABLESPACE
和 USING INDEX TABLESPACE
都是扩展。
又见
ALTER TABLE, DROP TABLE, CREATE TABLESPACE如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论