GBASE 8C——SQL参考6 sql语法(7)

  1. CREATE OPERATOR CLASS

功能描述

定义新的操作符类。

语法格式

CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type

  USING index_method [ FAMILY family_name ] AS

  {  OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]

   | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )

   | STORAGE storage_type

  } [, ... ]

参数说明

  1. name:新的操作符类名称,可以被模式修饰;
  2. DEFAULT:如果指定,则该操作符类将成为该数据类型的默认操作符类,每种特定的数据类型和索引最多有一个默认操作符类;
  3. data_type:这个操作符类所用于的列数据类型;
  4. index_method:这个操作符类所用于的索引方法的名称;
  5. family_name:要把这个操作符类加入其中的已有操作符族的名称,如果没有指定将使用一个同名操作符族,如果还不存在就创建一个;
  6. strategy_number:用于一个与该操作符类相关联的操作符的索引方法的策略编号;
  7. operator_name:一个与该操作符类相关联的操作符的名称,可以被模式修饰;
  8. op_type:表示该操作符的操作数数据类型;
  9. sort_family_name:现有btree操作符族的名称,可以被模式修饰;
  10. support_number:用于与该操作符类相关联的函数的索引方法支持过程编号;
  11. function_name:用于该操作符类的索引方法支持过程的函数名称,可以被模式修饰;
  12. argument_type:该函数的参数数据类型;
  13. storage_type:实际存储在索引中的数据类型

注意事项

OPERATOR、FUNCTION和STORAGE 子句可以以任何顺序出现。

范例

下面的例子为数据类型_int4(int4数组)定义了一个 GiST 索引操作符:

CREATE OPERATOR CLASS gist__int_ops

    DEFAULT FOR TYPE _int4 USING gist AS

        OPERATOR        3       &&,

        OPERATOR        6       = (anyarray, anyarray),

        OPERATOR        7       @>,

        OPERATOR        8       <@,

        OPERATOR        20      @@ (_int4, query_int),

        FUNCTION        1       g_int_consistent (internal, _int4, smallint, oid, internal),

        FUNCTION        2       g_int_union (internal, internal),

        FUNCTION        3       g_int_compress (internal),

        FUNCTION        4       g_int_decompress (internal),

        FUNCTION        5       g_int_penalty (internal, internal, internal),

        FUNCTION        6       g_int_picksplit (internal, internal),

        FUNCTION        7       g_int_same (_int4, _int4, internal);

语法兼容

CREATE OPERATOR CLASS是PostgreSQL扩展。

相关语法

ALTER OPERATOR CLASSDROP OPERATOR CLASSCREATE OPERATOR FAMILYALTER OPERATOR FAMILYDROP OPERATOR FAMILY

  1. CREATE OPERATOR FAMILY

功能描述

定义新的操作符族。

语法格式

CREATE OPERATOR FAMILY name USING index_method

参数说明

  1. name:新的操作符族的名称,可以被模式修饰;
  2. index_method:操作符族所属的索引的名称。

注意事项

只有系统管理员用户有权限创建操作符族。

语法兼容

CREATE OPERATOR FAMILY是PostgreSQL扩展。

相关语法

ALTER OPERATOR FAMILYDROP OPERATOR FAMILYCREATE OPERATOR CLASSALTER OPERATOR CLASSDROP OPERATOR CLASS

  1. CREATE POLICY

功能描述

对表创建行级安全性策略。

语法格式

CREATE POLICY name ON table_name

    [ AS { PERMISSIVE | RESTRICTIVE } ]

    [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]

    [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]

    [ USING ( using_expression ) ]

    [ WITH CHECK ( check_expression ) ]

参数说明

  1. name:新建的安全性策略名称,同一个数据表上安全性策略名称不能相同;
  2. table_name:安全性策略的表名;
  3. PERMISSIVE:指定将策略创建为宽松策略,即将所有查询策略使用“OR”运算符组合在一起;
  4. RESTRICTIVE:指定将该策略创建为限制性策略,即将所有查询策略使用“AND”运算符组合在一起;
  5. command:该策略的命令,取值范围:ALL、SELECT、INSERT、UPDATE以及DELETE,缺省为ALL;
  6. role_name:该策略应用的角色,缺省为PUBLIC,将把策略应用到所有角色;
  7. using_expression:安全性策略控制的表达式,返回boolean值,该表达式不能包含任何聚集函数或窗口函数,在查询重写阶段,如果数据表的行访问控制开关打开,满足条件的表达式会添加到计划树中。针对数据表的每条元组,会进行表达式计算,只有表达式返回值为TRUE时,行数据对用户才可见(SELECT、UPDATE、DELETE);当表达式返回FALSE时,该元组对当前用户不可见,用户无法通过SELECT语句查看此元组,无法通过UPDATE语句更新此元组,无法通过DELETE语句删除此元组;
  8. check_expression:安全性策略控制的表达式,返回boolean值,该表达式不能包含任何聚集函数或窗口函数,在查询重写阶段,如果数据表的行访问控制开关打开,满足条件的表达式会添加到计划树中。针对数据表的每条元组,会进行表达式计算,只有表达式返回值为TRUE时,行数据对用户才可见(INSERT、UPDATE);当表达式返回FALSE或NULL时,会报错,注意check_expression是根据新内容而不是原始内容计算的。

针对每种命令的策略

  1. ALL:为一条策略使用ALL表示它将适用于所有命令,无论命令的类型如何;
  2. SELECT:为一条策略使用SELECT表示它将适用于SELECT查询,并且需要保持在约束关系上的SELECT权限;
  3. INSERT:为一条策略使用INSERT表示它适用于INSERT命令;
  4. UPDATE:为一条策略使用UPDATE表示它适用于 UPDATE、SELECT FOR UPDATE 和SELECT FOR SHARE命令,还有INSERT 命令的ON CONFLICT DO UPDATE子句;
  5. DELETE:为一条策略使用DELETE表示它适用于DELETE命令,只有通过这条策略的数据才能被DELETE;

注意事项

当不同命令类型的多个策略应用于相同命令时(例如,应用于UPDATE命令的SELECT和UPDATE策略),则用户必须拥有两种类型的权限。

当同一命令类型的多个策略应用于同一个命令时,必须至少有一个允许访问该关系的 PERMISSIVE策略,并且必须通过所有的RESTRICTIVE策略。

范例

CREATE TABLE test_r(id int, role varchar(100), data varchar(100));

CREATE TABLE

CREATE POLICY test_rls ON test_r USING(role = CURRENT_USER);

CREATE POLICY

语法兼容

CREATE POLICY是PostgreSQL扩展。

相关语法

ALTER POLICYDROP POLICYALTER TABLE

  1. CREATE ROLE

功能描述

创建角色。

语法格式

CREATE ROLE name [ [ WITH ] option [ ... ] ]

where option可以是:

      SUPERUSER | NOSUPERUSER

    | CREATEDB | NOCREATEDB

    | CREATEROLE | NOCREATEROLE

    | INHERIT | NOINHERIT

    | LOGIN | NOLOGIN

    | REPLICATION | NOREPLICATION

    | BYPASSRLS | NOBYPASSRLS

    | CONNECTION LIMIT connlimit

    | [ ENCRYPTED ] PASSWORD 'password'

    | VALID UNTIL 'timestamp'

    | IN ROLE role_name [, ...]

    | IN GROUP role_name [, ...]

    | ROLE role_name [, ...]

    | ADMIN role_name [, ...]

    | USER role_name [, ...]

    | SYSID uid

参数说明

  1. name:角色名称;
  2. SUPERUSER | NOSUPERUSER:决定一个新角色是否为“系统管理员”,具有SYSADMIN属性的角色拥有系统最高权限,缺省为NOSYSADMIN;
  3. CREATEDB | NOCREATEDB:决定一个新角色是否能创建数据库,新角色没有创建数据库的权限,缺省为NOCREATEDB;
  4. CREATEROLE | NOCREATEROLE:决定一个角色是否可以创建新角色(也就是执行CREATE ROLE和CREATE USER),一个拥有CREATEROLE权限的角色也可以修改和删除其他角色,缺省为NOCREATEROLE;
  5. INHERIT | NOINHERIT:这些子句决定一个角色是否“继承”它所在组的角色的权限,缺省为INHERIT;
  6. LOGIN | NOLOGIN:具有LOGIN属性的角色才可以登录数据库。一个拥有LOGIN属性的角色可以认为是一个用户,缺省为NOLOGIN;
  7. REPLICATION | NOREPLICATION:定义角色是否允许流复制或设置系统为备份模式,REPLICATION属性是特定的角色,仅用于复制,缺省为NOREPLICATION;
  8. BYPASSRLS | NOBYPASSRLS:定义该角色可以绕过行级安全性策略(RLS),缺省为NOBYPASSRLS;
  9. CONNECTION LIMIT connlimit:声明该角色可以使用的并发连接数量,取值范围:整数,>=-1,缺省值为-1,表示没有限制;
  10. [ ENCRYPTED ] PASSWORD password:登录密码,密码规则如下:
    1. 如果没有设置密码,该角色无法登陆;
    2. 用PASSWORD NULL或指定空字符串可以设置空密码;
    3. 密码时钟以加密方式存储在系统目录中;
  1. VALID UNTIL 'timestamp':设置角色失效时间戳,在该时间点之后角色密码将失效,缺省情况下角色无时间限制;
  2. IN ROLE role_name:新角色立即拥有IN ROLE子句中列出的一个或多个现有角色拥有的权限;
  3. IN GROUP role_name:IN GROUP是IN ROLE过时的拼法,不推荐使用;
  4. ROLE role_name:ROLE子句列出一个或多个现有的角色,它们将自动添加为这个新角色的成员,拥有新角色所有的权限;
  5. ADMIN role_name:ADMIN子句类似ROLE子句,不同的是ADMIN后的角色可以把新角色的权限赋给其他角色;
  6. USER role_name:USER子句是ROLE子句过时的拼法;
  7. SYSID uid:SYSID子句将被忽略,无实际意义。

注意事项

在数据库中添加一个新角色,角色无登录权限。

创建角色的用户必须具备CREATE ROLE的权限或者是系统管理员。

范例

CREATE ROLE gbasedbt PASSWORD'root';

CREATE ROLE

语法兼容

SQL标准中有CREATE ROLE语句,但是标准只要求语法

CREATE ROLE name [ WITH ADMIN role_name ]

多个初始管理员以及CREATE ROLE的所有其他选项都是PostgreSQL扩展。

相关语法

SET ROLEALTER ROLEDROP ROLEGRANTREVOKECREATE USERCREATE GROUP

  1. CREATE RULE

功能描述

定义新的重写规则。

语法格式

CREATE [ OR REPLACE ] RULE name AS ON event

    TO table_name [ WHERE condition ]

    DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }

其中 event 可以是以下之一:

    SELECT | INSERT | UPDATE | DELETE

参数说明

  1. name:新的规则的名称,同一个表上的规则名不能相同;
  2. event:SELECT、INSERT、UPDATE或者DELETE之一;
  3. table_name:规则适用的表或者视图的名称,可以被模式修饰;
  4. condition:任意的SQL条件表达式,返回boolean值,该条件不能用在除NEW以及OLD外的任何表,且不能包含聚集函数;
  5. ALSO | INSTEAD:ALSO表示应该在原始命令之外执行这些命令,INSTEAD表示该命令应该取代原始命令被执行,缺省为ALSO;
  6. command:新规则的命令,可能为SELECT、INSERT、UPDATE或者DELETE。

注意事项

同一个表上的同种事件类型的多条规则会按照其名称的字符顺序被应用。

范例

CREATE RULE "_RETURN" AS

    ON SELECT TO t1

    DO INSTEAD

        SELECT * FROM test_t;

CREATE RULE

语法兼容

CREATE RULE是一种 PostgreSQL语言扩展。

相关语法

ALTER RULEDROP RULE

  1. CREATE SCHEMA

功能描述

创建新的模式。

语法格式

CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]

CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]

CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]

CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification

其中 role_specification 可以是:

    user_name

  | CURRENT_USER

  | SESSION_USER

参数说明

  1. schema_name:新模式的名称,模式名不能和当前数据库里其他的模式重名,模式的名字不可以“pg_”开头;
  2. user_name:指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名;
  3. schema_element:在模式里创建对象的SQL语句,当前仅支持CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE SEQUENCE、CREATE TRIGGER以及GRANT子句,其他类型的对象可以在模式创建后使用单独的命令创建;
  4. IF NOT EXISTS:如果有同名的模式已存在,不报错,仅提示。

注意事项

只要用户对当前数据库有CREATE权限,就可以创建模式。

系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。

范例

CREATE SCHEMA gbaseschema;

CREATE SCHEMA

语法兼容

SQL 标准允许在CREATE SCHEMA中有一个DEFAULT CHARACTER SET子句。

相关语法

ALTER SCHEMADROP SCHEMA

  1. CREATE SEQUENCE

功能描述

创建一个新的序列。

语法格式

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ]

    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]

    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]

    [ OWNED BY { table_name.column_name | NONE } ]

参数说明

  1. TEMPORARY | TEMP:指定仅为本会话创建序列对象,且会话退出后自动删除;
  2. IF NOT EXISTS:如果重名不报错,仅提示;
  3. name:将要创建的序列的名称,可以被模式修饰;
  4. data_type:指定序列的数据类型,取值范围:smallint、integer和bigint,缺省为bigint;
  5. increment:指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列,缺省为1;
  6. MINVALUE minvalue | NO MINVALUE:执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为数据类型的最小值,NOMINVALUE等价于NO;
  7. MAXVALUE maxvalue | NO MAXVALUE:执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为数据类型的最大值,递减序列的缺省值为-1,NOMAXVALUE等价于NO;
  8. start:指定序列的起始值。缺省值:对于递增序列为minvalue,递减序列为maxvalue;
  9. cache:为了快速访问,而在内存中预先存储序列号的个数,缺省值为1,表示一次只能生成一个值,也就是没有缓存;
  10. CYCLE | NO CYCLE:用于使序列达到maxvalue或者minvalue后可循环并继续下去,如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会报错,缺省值为NO CYCLE;
  11. OWNED BY table_name.column_name | OWNED BY NONE:将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中,缺省值为OWNED BY NONE,表示不存在这样的关联。

注意事项

如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。

创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。

范例

创建一个从101开始的递增序列:

CREATE SEQUENCE serial START 101;

CREATE SEQUENCE

从序列中选取下一个数字

SELECT nextval('serial');

 nextval

---------

     101

(1 row)

在INSERT命令中使用序列:

INSERT INTO disttab VALUES (nextval('serial'),nextval('serial'),'蜀');

INSERT 0 1

语法兼容

CREATE SEQUENCE符合SQL 标准。

相关语法

ALTER SEQUENCEDROP SEQUENCE

  1. CREATE STATISTICS

功能描述

定义扩展统计。

语法格式

CREATE STATISTICS [ IF NOT EXISTS ] statistics_name

    [ ( statistics_kind [, ... ] ) ]

    ON column_name, column_name [, ...]

    FROM table_name

参数说明

  1. IF NOT EXISTS:如果重名不报错,仅提示;
  2. statistics_name:新的统计对象的名称,可以被模式修饰;
  3. statistics_kind:该统计对象中计算的统计种类,取值范围:ndistinct、dependencies(功能依赖性统计),缺省情况下,统计对象包含所有支持的统计类型;
  4. column_name:被计算的表的列名,应至少给出两个列名;
  5. table_name:被计算的表名,可以被模式修饰。

注意事项

只有表的所有者可以创建读取表的统计对象。

范例

CREATE TABLE t1 (

    a   int,

    b   int

);

INSERT INTO t1 SELECT i/100, i/500

                 FROM generate_series(1,1000000) s(i);

ANALYZE t1;

-- 匹配行的数量将被大大低估:

EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;

ANALYZE t1;

-- 现在行计数估计会更准确:

EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

语法兼容

SQL标准中没有CREATE STATISTICS命令。

相关语法

ALTER STATISTICSDROP STATISTICS

  1. CREATE TABLE

功能描述

创建新表。

语法格式

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [

  { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]

    | table_constraint

    | LIKE source_table [ like_option ... ] }

    [, ... ]

] )

[ INHERITS ( parent_table [, ... ] ) ]

[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]

[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | 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 } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]

[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]

[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]

[ TABLESPACE tablespace_name ]

[

  DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } |

  DISTRIBUTED { { BY ( column_name ) } | { RANDOMLY } |

  DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name )

]

[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]

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

[ PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]

[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]

[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]

[ TABLESPACE tablespace_name ]

  DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } |

  DISTRIBUTED { { BY ( column_name ) } | { RANDOMLY } |

  DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name )

]

[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]

其中 column_constraint 是:

[ CONSTRAINT constraint_name ]

{ NOT NULL |

  NULL |

  CHECK ( expression ) [ NO INHERIT ] |

  DEFAULT default_expr |

  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |

  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 ) [ NO INHERIT ] |

  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 } { COMMENTS | CONSTRAINTS | DEFAULTS | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }

partition_bound_spec 是:

IN ( { numeric_literal | string_literal | TRUE | FALSE | NULL } [, ...] ) |

FROM ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )

  TO ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )

UNIQUE、PRIMARY KEY以及EXCLUDE约束中的index_parameters是:

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

[ USING INDEX TABLESPACE tablespace_name ]

EXCLUDE约束中的exclude_element是:

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

参数说明

  1. TEMPORARY | TEMP:如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的CN以外的其他CN故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价;
  2. UNLOGGED:如果指定此关键字,则创建的表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是非日志表在冲突、执行操作系统重启、强制重启、切断电源操作或异常关机后会被自动截断,会造成数据丢失的风险。非日志表中的内容也不会被复制到备服务器中。在非日志表中创建的索引也不会被自动记录;

使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。

故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。

  1. IF NOT EXISTS:如果重名不报错,仅提示;
  2. table_name:要创建的表的名称,可以被模式修饰;
  3. OF type_name:创建一个类型化的表,它的结构取自于指定的组合类型,名字可以被模式修饰。类型话的表和类型绑定,如果类型被删除,则表也被删除;
  4. PARTITION OF parent_table FOR VALUES partition_bound_spec:将表创建为指定父表的分区,partition_bound_spec 必须对应于父表的分区方式和分区键,并且不能与该父表的任何现有分区重叠;
  5. column_name:新表中要创建的字段名;
  6. data_type:字段的数据类型;
  7. COLLATE collation:COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则;
  8. INHERITS ( parent_table [, ... ] ):新表从parent_table继承所有列,该语句可选;
  9. PARTITION BY { RANGE | LIST } ( { column_name | ( expression ) } [ opclass ] [, ...] ):指定指定表分区策略,该语句可选。分区表不支持UNIQUE、 PRIMARY KEY、EXCLUDE或 FOREIGN KEY约束,仅可以在单个分区中定义这些约束;
  10. LIKE source_table [ like_option ... ]:LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型和非空约束。新表与源表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。被复制的列和约束并不使用相同的名字进行融合。如果明确的指定了相同的名字或者在另外一个LIKE子句中,将会报错。
    1. 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。
    2. 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。
    3. 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。
    4. 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。
    5. 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。
    6. INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING IDENTITY、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS的内容。
  1. CONSTRAINT constraint_name:列约束或表约束的名字。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新;
  2. NOT NULL:字段值不允许为NULL;
  3. NULL:字段值允许为NULL,且缺省为NULL;
  4. CHECK ( expression ) [ NO INHERIT ]:CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段;
  5. DEFAULT default_expr:DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其他字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL;
  6. GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]:将列创建为标识列,且附加一个隐式序列,新行中的列将自动从分配给它的序列中获取值;
  7. UNIQUE (列约束)

UNIQUE ( column_name [, ... ] ) (表约束):UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一,对于唯一约束,NULL被认为是互不相等的;

  1. PRIMARY KEY (列约束)

PRIMARY KEY ( column_name [, ... ] ) (表约束):主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值,一个表只能声明一个主键;

  1. EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ]:指定一个排除约束,如果任意两行指定列或表达式上使用指定操作符进行比较,均不符合的情况下回返回TRUE;
  2. REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (列约束)

FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (表约束):

这些子句指定外键约束,表示新表的一列或列的组必须只包含能匹配引用中的表的某行在引用列上的值;

    1. NO ACTION:删除或更新将会违背外键约束时报错,可以延迟检查;
    2. RESTRICT:删除或更新将会违背外键约束时报错,不可延迟检查;
    3. CASCADE:删除或更新时同时操作被引用列的值;
    4. SET NULL:将引用列设置为空;
    5. SET DEFAULT:将引用列设置为默认值;
  1. DEFERRABLE | NOT DEFERRABLE:这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束和主键约束可以接受这个子句。所有其他约束类型都是不可推迟的;
  2. INITIALLY IMMEDIATE | INITIALLY DEFERRED:如果约束是可推迟的,则这个子句声明检查约束的缺省时间,如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它;如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它;
  3. WITH ( storage_parameter [= value] [, ... ] ):这个子句为表或索引指定一个可选的存储参数:
  1. fillfactor (integer):表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义;
  2. parallel_workers (integer):这个参数设置应该被用来辅助对这个表并行扫描的工作者数量。如果没有设置这个参数,系统将基于关系的尺寸来决定一个值。规划器实际选择的工作者数量可能会少于这个参数,例如max_worker_processes的设置较小就是一种可能的原因;
  3. autovacuum_enabled, toast.autovacuum_enabled (boolean):为一个特定的表启用或者禁用自动清理守护进程。如果为真,自动清理守护进程将在这个表上执行自动的VACUUM或者ANALYZE操作。如果为假,这个表不会被自动清理,不过为了阻止事务 ID 回卷时还是会对它进行自动的清理。如果autovacuum参数为假,自动清理守护进程根本就不会运行(除非为了阻止事务 ID 回卷),设置独立的表存储参数也不会覆盖这个设置。因此显式地将这个存储参数设置为true很少有大的意义,只有设置为false才更有用;
  4. autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer):autovacuum_vacuum_threshold参数对于每个表的值;
  5. autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (float4):autovacuum_vacuum_scale_factor参数对于每个表的值;
  6. autovacuum_analyze_threshold (integer):autovacuum_analyze_threshold参数对于每个表的值;
  7. autovacuum_analyze_scale_factor (float4):autovacuum_analyze_scale_factor参数对于每个表的值;
  8. autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (integer):autovacuum_vacuum_cost_delay参数对于每个表的值;
  9. autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer):autovacuum_vacuum_cost_limit参数对于每个表的值;
  10. autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer):vacuum_freeze_min_age参数对于每个表的值。注意自动清理将忽略超过系统范围autovacuum_freeze_max_age参数一半的针对每个表的autovacuum_freeze_min_age参数;
  11. autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer):autovacuum_freeze_max_age参数对于每个表的值。注意自动清理将忽略超过系统范围参数(只能被设置得较小)一半的针对每个表的autovacuum_freeze_max_age参数;
  12. autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer):vacuum_freeze_table_age参数对于每个表的值;
  13. autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age (integer):vacuum_multixact_freeze_min_age参数对于每个表的值。注意自动清理将忽略超过系统范围autovacuum_multixact_freeze_max_age参数一半的针对每个表的autovacuum_multixact_freeze_min_age参数;
  14. autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (integer):autovacuum_multixact_freeze_max_age参数对于每个表的值。注意自动清理将忽略超过系统范围参数(只能被设置得较小)一半的针对每个表的autovacuum_multixact_freeze_max_age参数;
  15. autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age (integer):vacuum_multixact_freeze_table_age参数对于每个表的值;
  16. log_autovacuum_min_duration, toast.log_autovacuum_min_duration (integer):log_autovacuum_min_duration参数对于每个表的值;
  17. user_catalog_table (boolean):声明该表是一个用于逻辑复制目的的额外的目录表;

WITH子句还可以包括OIDS=TRUE(或者只包括OIDS)来指定新表的行应该具有被分配的 OID(对象标识符),或者包括OIDS=FALSE来指定新表的行不具有 OID。如果没有指定OIDS,默认设置取决于default_with_oids配置参数(如果新表是从任何具有 OID 的表继承而来,那么即使该命令要求OIDS=FALSE也会强制使用OIDS=TRUE)。

如果指定或者蕴含了OIDS=FALSE,新表就不会存储 OID 并且对插入其中的一个新行不会分配 OID。它将减少 OID 消耗并且因而推迟 32 为 OID 计数器的回卷。一旦计数器回卷,OID 就不再能被假定为唯一。另外,从一个表中排除 OID 可以减少存储该表所需的磁盘空间,减少的量是每行减少 4 字节(在大部分机器上),可以适当提高性能。

  1. WITH OIDS | WITHOUT OIDS:等效于WITH (OIDS)和WITH (OIDS=FALSE);
  2. ON COMMIT:ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。有以下三个选项:
  1. PRESERVE ROWS(缺省值):提交时不对临时表做任何操作,临时表及其表数据保持不变;
  2. DELETE ROWS:提交时删除临时表中数据;
  3. DROP:提交时删除此临时表;
  1. TABLESPACE tablespace_name:创建新表时指定此关键字,表示新表将要在指定表空间内创建。如果没有声明,将使用默认表空间;
  2. DISTRIBUTE BY:指定表如何在节点之间分布或者复制;

如果未指定DISTRIBUTE BY,则将选择具有UNIQUE约束的列作为分布键。果未指定此类列,则分布列是定义中第一个符合条件的列。如果未找到此类列,则该表将由ROUNDROBIN分发。

    1. REPLICATION:表的每一行存在所有数据节点(DN)中,即每个数据节点都有完整的表数据;
    2. ROUNDROBIN:表的每一行都将以循环方式放置在其中一个DN中;
    3. HASH ( column_name ):对指定的列进行Hash,通过映射,把数据分布到指定DN;

允许以下类型作为分布列:INT8、INT2、OID、INT4、BOOL、INT2VECTOR、OIDVECTOR、CHAR、NAME、TEXT、BPCHAR、BYTEA、VARCHAR、NUMERIC、MONEY、ABSTIME、RELTIME、DATE、TIME、TIMESTAMP、TIMESTAMPTZ、 INTERVAL 和 TIMETZ。

    1. MODULO ( column_name ):表格的每一行都将根据指定列的模数放置;

允许以下类型作为分布列:INT8、INT2、INT4、BOOL、ABSTIME、RELTIME、DATE。

  1. TO GROUP | TO NODE:定义表数据存储的节点/节点组;
  2. nodename:数据库节点名称;
  3. groupname:数据库节点组名称;
  4. USING INDEX TABLESPACE tablespace_name:为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default_tablespace中创建,如果default_tablespace为空,将使用数据库的缺省表空间。

注意事项

一个表的列通常不能超过1600列。

数据库为每一个唯一约束和主键约束创建一个索引来强制唯一性。因此,没有必要显式地为主键列创建一个索引。

范例

CREATE TABLE customer

(

ID int,

Name varchar(200),

Birthday date,

Tel varchar(50)

);

CREATE TABLE

相关语法

ALTER TABLEDROP TABLECREATE TABLESPACE

  1. CREATE TABLE AS

功能描述

根据查询结果创建表。

语法格式

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name

    [ (column_name [, ...] ) ]

    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]

    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]

    [ TABLESPACE tablespace_name ]

    [

      DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } |

      DISTRIBUTED { { BY ( column_name ) } | { RANDOMLY } |

      DISTSTYLE { EVEN | KEY | ALL } DISTKEY ( column_name )

    ]

    [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]

    AS query

    [ WITH [ NO ] DATA ]

参数说明

  1. GLOBAL | LOCAL:不推荐使用;
  2. TEMPORARY | TEMP:创建一个临时表;
  3. UNLOGGED:如果指定此关键字,则创建的表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是非日志表在冲突、执行操作系统重启、强制重启、切断电源操作或异常关机后会被自动截断,会造成数据丢失的风险。非日志表中的内容也不会被复制到备服务器中。在非日志表中创建的索引也不会被自动记录;

使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。

故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。

  1. IF NOT EXISTS:如果重名不报错,仅提示;
  2. table_name:要创建的表的名称,可以被模式修饰;
  3. column_name:新表中要创建的字段名,如果没有提供列名,会从查询的输出列名中得到;
  4. WITH ( storage_parameter [= value] [, ... ] ):这个子句为表或索引指定一个可选的存储参数,详见CREATE TABLE
  1. WITH OIDS | WITHOUT OIDS:等效于WITH (OIDS)和WITH (OIDS=FALSE);
  2. ON COMMIT:ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。有以下三个选项:
  1. PRESERVE ROWS(缺省值):提交时不对临时表做任何操作,临时表及其表数据保持不变;
  2. DELETE ROWS:提交时删除临时表中数据;
  3. DROP:提交时删除此临时表;
  1. TABLESPACE tablespace_name:指定新表将要在tablespace_name表空间内创建。如果没有声明,将使用默认表空间;
  2. DISTRIBUTE BY:指定表如何在节点之间分布或者复制;

如果未指定DISTRIBUTE BY,则将选择具有UNIQUE约束的列作为分布键。果未指定此类列,则分布列是定义中第一个符合条件的列。如果未找到此类列,则该表将由ROUNDROBIN分发。

    1. REPLICATION:表的每一行存在所有数据节点(DN)中,即每个数据节点都有完整的表数据;
    2. ROUNDROBIN:表的每一行都将以循环方式放置在其中一个DN中;
    3. HASH ( column_name ):对指定的列进行Hash,通过映射,把数据分布到指定DN;

允许以下类型作为分布列:INT8、INT2、OID、INT4、BOOL、INT2VECTOR、OIDVECTOR、CHAR、NAME、TEXT、BPCHAR、BYTEA、VARCHAR、NUMERIC、MONEY、ABSTIME、RELTIME、DATE、TIME、TIMESTAMP、TIMESTAMPTZ、 INTERVAL 和 TIMETZ。不允许将浮点型作为分布列。

    1. MODULO ( column_name ):表格的每一行都将根据指定列的模数放置;

允许以下类型作为分布列:INT8、INT2、INT4、BOOL、ABSTIME、RELTIME、DATE。

  1. TO GROUP | TO NODE:定义表数据存储的节点/节点组;
  2. nodename:数据库节点名称;
  3. groupname:数据库节点组名称;
  4. query:一个SELECT、TABLE或者VALUES 命令,或者是一个运行准备好的SELECT、 TABLE或者 VALUES查询的EXECUTE命令;
  5. WITH [ NO ] DATA:创建表时,是否也插入查询到的数据。默认是要数据,选择“NO”参数时,则不要数据;

注意事项

CREATE TABLE AS命令允许用户显式地指定 是否应该包括 OID。如果没有显式地指定 OID 的存在,将使用 default_with_oids配置变量来判断。

范例

CREATE TABLE ts_t2 AS SELECT * FROM t2 WHERE b<2;

语法兼容

CREATE TABLE AS符合 SQL标准。

相关语法

CREATE MATERIALIZED VIEWCREATE TABLEEXECUTESELECTSELECT INTOVALUES

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值