Postgresql 数据类型
Postgresql 删除数据表 

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);