Postgresql 创建数据表
在 PostgreSQL 中创建数据表是一个相对直接的过程。你可以使用 CREATE TABLE 语句来定义表的结构,包括列名、数据类型和约束。
语法格式
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [ { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION compression_method ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option ... ] } [, ... ] ] ) [ INHERITS ( parent_table [, ... ] ) ] [ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] [ USING method ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name OF type_name [ ( { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ] | table_constraint } [, ... ] ) ] [ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] [ USING method ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name PARTITION OF parent_table [ ( { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ] | table_constraint } [, ... ] ) ] { FOR VALUES partition_bound_spec | DEFAULT } [ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] [ USING method ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ]where column_constraint is:[ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) [ NO INHERIT ] | DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]and table_constraint is:[ CONSTRAINT constraint_name ] { CHECK ( expression ) [ NO INHERIT ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] ( 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 referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]and like_option is:{ INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }and partition_bound_spec is:IN ( partition_bound_expr [, ...] ) | FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:[ INCLUDE ( column_name [, ... ] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ]exclude_element in an EXCLUDE constraint is:{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]referential_action in a FOREIGN KEY/REFERENCES constraint is:{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }
参数说明:
TEMPORARY or TEMP -- 如果指定,则表将创建为临时表。临时 table 会在会话结束时自动删除,或者选择性地在当前事务结束时删除(请参阅下面的 ON COMMIT)。默认search_path首先包含临时模式,因此,当临时表存在时,不会为新计划选择同名的现有永久表,除非使用模式限定的名称引用它们。在临时表上创建的任何索引也自动是临时的。autovacuum 守护程序无法访问,因此无法对临时表执行 vacuum 操作或分析。因此,应通过会话 SQL 命令执行适当的 vacuum 和分析操作。例如,如果要在复杂查询中使用临时表,那么在填充临时表后对临时表运行 ANALYZE 是明智的。(可选)可以在 TEMPORARY 或 TEMP 之前写入 GLOBAL 或 LOCAL。
UNLOGGED -- 如果指定,则表将创建为无日志记录表。写入 unlogged table 的数据不会写入预写日志(请参见Chapter 30),这使得它们比普通 table 快得多。但是,它们不是崩溃安全的:未记录的 table 在崩溃或不正常关闭后会自动截断。unlogged table 的内容也不会复制到备用服务器。在未记录的表上创建的任何索引也会自动取消记录。如果指定了此选项,则与 unlogged 表(用于标识或序列列)一起创建的任何序列也将创建为 unlogged。
IF NOT EXISTS -- 如果已存在同名关系,请不要引发错误。在这种情况下,将发出通知。请注意,不能保证现有关系与已创建的关系类似。
table_name -- 要创建的表的名称(可选是架构限定的)。
OF type_name -- 创建一个类型化表,该表从指定的复合类型(名称可选为架构限定)中获取其结构。类型表与其类型相关联;例如,如果删除类型(使用 DROP TYPE ...CASCADE 的 CASCADE)。创建类型表时,列的数据类型由基础复合类型确定,而不是由 CREATE TABLE 命令指定。但是 CREATE TABLE 命令可以向表添加默认值和约束,并且可以指定存储参数。
column_name -- 要在新表中创建的列的名称。
data_type -- 列的数据类型。这可以包括数组说明符。
COLLATE collation -- COLLATE 子句为列分配排序规则(必须是可排序的数据类型)。如果未指定,则使用 column 数据类型的默认排序规则。
STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } -- 此表单设置列的存储模式。这控制此列是内联保存还是在辅助 TOAST 表中保存,以及是否应压缩数据。PLAIN 必须用于固定长度的值,例如 integer 并且是内联的、未压缩的。MAIN 用于内联、可压缩数据。EXTERNAL 用于外部的未压缩数据,EXTENDED 用于外部的压缩数据。写入 DEFAULT 会将存储模式设置为列数据类型的默认模式。EXTENDED 是大多数支持非 PLAIN 存储的数据类型的默认值。
COMPRESSION compression_method -- COMPRESSION 子句设置列的压缩方法。只有可变宽度数据类型才支持压缩,并且仅当列的存储模式为 main 或 extended 时才使用压缩。(有关列存储模式的信息,请参阅 ALTER TABLE.)为分区表设置此属性没有直接影响,因为此类 table 没有自己的存储空间,但配置的值将被新创建的分区继承。支持的压缩方法是 pglz 和 lz4。(仅当在构建 PostgreSQL 时使用 --with-lz4 时,lz4 才可用。此外,compression_method 可以是 default 来显式指定默认行为,即在数据插入时查阅 default_toast_compression 设置以确定要使用的方法。
INHERITS ( parent_table [, ... ] ) -- 可选的 INHERITS 子句指定新 table 自动从中继承所有列的 table 列表。父表可以是普通表或外部表。
PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ opclass ] [, ...] ) -- 可选的 PARTITION BY 子句指定对 table 进行分区的策略。这样创建的表称为分区表。带括号的列或表达式列表构成表的分区键。使用范围或哈希分区时,分区键可以包含多个列或表达式(最多 32 个,但在构建 PostgreSQL 时可以更改此限制),但对于列表分区,分区键必须由单个列或表达式组成。
PARTITION OF parent_table { FOR VALUES partition_bound_spec | DEFAULT } -- 将表创建为指定父表的分区。可以使用 FOR VALUES 将表创建为特定值的分区,也可以使用 DEFAULT 创建为默认分区。父表中存在的任何索引、约束和用户定义的行级触发器都将克隆到新分区上。
LIKE source_table [ like_option ... ] -- LIKE 子句指定一个表,新表会自动从该表中复制所有列名、其数据类型及其非 null 约束。
使用示例
CREATE TABLE students ( sno char(10) CONSTRAINT firstkey PRIMARY KEY, name varchar(40) NOT NULL, class_id varchar(10) NOT NULL, birth_date date, email varchar(30) ); CREATE TABLE classes ( class_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, class_name varchar(40) NOT NULL CHECK (class_name <> '') ); CREATE TABLE array_int ( vector int[][] ); CREATE TABLE classes ( class_id integer, class_name varchar(40), UNIQUE(class_name) ); --创建哈希分区表: CREATE TABLE orders ( id SERIAL PRIMARY KEY, order_date DATE NOT NULL, amount NUMERIC ) PARTITION BY HASH (id);