云服务器内容精选

  • 修改约束示例 为列添加非空约束。 --建表。 gaussdb=# CREATE TABLE test_alt3(pid INT, areaid CHAR(5), name VARCHAR(20)); --为pid添加非空约束。 gaussdb=# ALTER TABLE test_alt3 MODIFY pid NOT NULL; --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | not null areaid | character(5) | name | character varying(20) | --取消列的非空约束。 gaussdb=# ALTER TABLE test_alt3 MODIFY pid NULL; --在线为pid添加非空约束。 gaussdb=# ALTER TABLE ONLINE test_alt3 MODIFY pid NOT NULL; --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | not null areaid | character(5) | name | character varying(20) | 取消列的非空约束。 gaussdb=# ALTER TABLE test_alt3 MODIFY pid NULL; --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | areaid | character(5) | name | character varying(20) | 修改字段默认值。 --修改test_alt3表中id的默认值。 gaussdb=# ALTER TABLE test_alt3 ALTER COLUMN areaid SET DEFAULT '00000'; --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+------------------------- pid | integer | areaid | character(5) | default '00000'::bpchar name | character varying(20) | --删除id的默认值。 gaussdb=# ALTER TABLE test_alt3 ALTER COLUMN areaid DROP DEFAULT; --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | areaid | character(5) | name | character varying(20) | 添加表级约束。 直接添加约束。 --给表添加主键约束。 gaussdb=# ALTER TABLE test_alt3 ADD CONSTRAINT pk_test3_pid PRIMARY KEY (pid); --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | not null areaid | character(5) | name | character varying(20) | Indexes: "pk_test3_pid" PRIMARY KEY, ubtree (pid) WITH (storage_type=USTORE) TABLESPACE pg_default --删除表 gaussdb=# DROP TABLE IF EXISTS test_alt3; --建表。 gaussdb=# CREATE TABLE test_alt3(pid INT, areaid CHAR(5), name VARCHAR(20)); --在线给表添加主键约束。 gaussdb=# ALTER TABLE ONLINE test_alt3 ADD CONSTRAINT pk_test3_pid PRIMARY KEY (pid); --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | not null areaid | character(5) | name | character varying(20) | Indexes: "pk_test3_pid" PRIMARY KEY, ubtree (pid) WITH (storage_type=USTORE) TABLESPACE pg_default 先创建索引然后再添加约束。 --建表。 gaussdb=# CREATE TABLE test_alt4(c1 INT, c2 INT); --建索引。 gaussdb=# CREATE UNIQUE INDEX pk_test4_c1 ON test_alt4(c1); --添加约束时关联已经创建的索引。 gaussdb=# ALTER TABLE test_alt4 ADD CONSTRAINT pk_test4_c1 PRIMARY KEY USING INDEX pk_test4_c1; --查看。 gaussdb=# \d test_alt4 Table "public.test_alt4" Column | Type | Modifiers --------+---------+----------- c1 | integer | not null c2 | integer | Indexes: "pk_test4_c1" PRIMARY KEY, ubtree (c1) WITH (storage_type=USTORE) TABLESPACE pg_default --删除。 gaussdb=# DROP TABLE test_alt4; 删除表级约束。 --删除约束。 gaussdb=# ALTER TABLE test_alt3 DROP CONSTRAINT IF EXISTS pk_test3_pid; --查看。 gaussdb=# \d test_alt3 Table "public.test_alt3" Column | Type | Modifiers --------+-----------------------+----------- pid | integer | not null areaid | character(5) | name | character varying(20) | --删除。 gaussdb=# DROP TABLE test_alt3; --删除主键约束(该语法仅在MYSQL兼容模式下支持)。 gaussdb=# CREATE TABLE test_drop_primary_key(c1 INT PRIMARY KEY); gaussdb=# \d test_drop_primary_key Table "public.test_drop_primary_key" Column | Type | Modifiers --------+---------+----------- c1 | integer | not null Indexes: "test_drop_primary_key_pkey" PRIMARY KEY, ubtree (c1) WITH (storage_type=USTORE) TABLESPACE pg_default gaussdb=# ALTER TABLE test_drop_primary_key DROP PRIMARY KEY; gaussdb=# \d test_drop_primary_key Table "public.test_drop_primary_key" Column | Type | Modifiers --------+---------+----------- c1 | integer | not null 重命名约束。 --创建表tbl_test1,指定主键约束。 gaussdb=# CREATE TABLE tbl_test1( id int, name varchar(50), CONSTRAINT aaa PRIMARY KEY (id) ); --重命名约束。 gaussdb=# ALTER TABLE tbl_test1 RENAME CONSTRAINT aaa TO pk_test1_id; --查看信息。 gaussdb=# \d tbl_test1; Table "public.tbl_test1" Column | Type | Modifiers --------+-----------------------+----------- id | integer | not null name | character varying(50) | Indexes: "pk_test1_id" PRIMARY KEY, ubtree (id) WITH (storage_type=USTORE) TABLESPACE pg_default --删除表。 gaussdb=# DROP TABLE tbl_test1;
  • 修改列示例 修改列名。 --建表。 gaussdb=# CREATE TABLE test_alt2(c1 INT,c2 INT); --修改列名。 gaussdb=# ALTER TABLE test_alt2 RENAME c1 TO id; gaussdb=# ALTER TABLE test_alt2 RENAME COLUMN c2 to areaid; --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers --------+---------+----------- id | integer | areaid | integer | 增加列。 --表test_alt2增加列。 gaussdb=# ALTER TABLE IF EXISTS test_alt2 ADD COLUMN name VARCHAR(20); --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | areaid | integer | name | character varying(20) | 增加自增列。 --表local_autoinc增加AUTO_INCREMENT自增列(根据实际情况修改DATANODE名字,SELECT node_name FROM pgxc_node WHERE node_type = 'D';)。 gaussdb=# CREATE TABLE local_autoinc(col1 int) DISTRIBUTE BY LIST(col1)( SLICE s1 VALUES (1) DATANODE datanode1, SLICE s2 VALUES (2) DATANODE datanode2 ); --数据分布到DN1上。 gaussdb=# INSERT INTO local_autoinc(col1) VALUES(1); --添加一个本地自增列,每个DN从1开始自增。 gaussdb=# ALTER TABLE local_autoinc ADD COLUMN col int AUTO_INCREMENT; gaussdb=# SELECT col,col1 FROM local_autoinc ORDER BY 2,1; col | col1 -----+------ 1 | 1 (1 row) --将所有DN的下一个自增值设为10。 gaussdb=# ALTER TABLE local_autoinc AUTO_INCREMENT = 10; --数据分布到DN1上,NULL触发自增,自增值为10。 gaussdb=# INSERT INTO local_autoinc(col, col1) VALUES(NULL,1); --数据分布到DN2上,0触发自增,自增值为10。 gaussdb=# INSERT INTO local_autoinc(col, col1) VALUES(0,2); gaussdb=# SELECT col,col1 FROM local_autoinc ORDER BY 2,1; col | col1 -----+------ 1 | 1 10 | 1 10 | 2 (3 rows) 修改列的数据类型。 --修改test_alt2表中name字段的类型。 gaussdb=# ALTER TABLE test_alt2 MODIFY name VARCHAR(50); --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers --------+-----------------------+----------- id | integer | areaid | integer | name | character varying(50) | --在线修改test_alt2表中name字段的类型。 gaussdb=# ALTER TABLE ONLINE test_alt2 MODIFY name VARCHAR(60); --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers --------+-----------------------+----------- id | integer | areaid | integer | name | character varying(60) | --修改test_alt2表中name字段的类型。 gaussdb=# ALTER TABLE test_alt2 ALTER COLUMN name TYPE VARCHAR(25); --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers --------+-----------------------+----------- id | integer | areaid | integer | name | character varying(25) | --在线修改test_alt2表中name字段的类型。 gaussdb=# ALTER TABLE ONLINE test_alt2 ALTER COLUMN name TYPE VARCHAR(35); --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers --------+-----------------------+----------- id | integer | areaid | integer | name | character varying(35) | 删除列。 --删除test_alt2中areaid字段。 gaussdb=# ALTER TABLE test_alt2 DROP COLUMN areaid; --查看。 gaussdb=# \d test_alt2 Table "public.test_alt2" Column | Type | Modifiers --------+-----------------------+----------- id | integer | name | character varying(25) | 修改列的存储模式。 --查看表详细信息。 gaussdb=# \d+ test_alt2 Table "public.test_alt2" Column | Type | Modifiers | Storage | Stats target | Description --------+-----------------------+-----------+----------+--------------+------------- id | integer | | plain | | name | character varying(35) | | extended | | Has OIDs: no Distribute By: HASH(id) Location Nodes: ALL DATANODES Options: orientation=row, compression=no, storage_type=USTORE, segment=off --修改test_alt2表中name字段的存储模式。 gaussdb=# ALTER TABLE test_alt2 ALTER COLUMN name SET STORAGE PLAIN; --查看。 gaussdb=# \d+ test_alt2 Table "public.test_alt2" Column | Type | Modifiers | Storage | Stats target | Description --------+-----------------------+-----------+---------+--------------+------------- id | integer | | plain | | name | character varying(35) | | plain | | Has OIDs: no Distribute By: HASH(id) Location Nodes: ALL DATANODES Options: orientation=row, compression=no, storage_type=USTORE, segment=off --删除。 gaussdb=# DROP TABLE test_alt2;
  • 修改表示例 重命名表。 gaussdb=# CREATE TABLE aa(c1 int, c2 int); gaussdb=# ALTER TABLE IF EXISTS aa RENAME TO test_alt1; 修改表所属模式。 --创建模式test_schema。 gaussdb=# CREATE SCHEMA test_schema; --把表test_alt1的所属模式修改为test_schema。 gaussdb=# ALTER TABLE test_alt1 SET SCHEMA test_schema; --查询表信息。 gaussdb=# SELECT schemaname,tablename FROM pg_tables WHERE tablename = 'test_alt1'; schemaname | tablename -------------+----------- test_schema | test_alt1 (1 row) 修改表的所有者。 --创建用户test_user。 gaussdb=# CREATE USER test_user PASSWORD '********'; --修改test_alt1表的所有者为test_user。 gaussdb=# ALTER TABLE IF EXISTS test_schema.test_alt1 OWNER TO test_user; --查看。 gaussdb=# SELECT tablename, schemaname, tableowner FROM pg_tables WHERE tablename = 'test_alt1'; tablename | schemaname | tableowner -----------+-------------+------------ test_alt1 | test_schema | test_user (1 row) 修改表的表空间。 --创建表空间tbs_data1。 gaussdb=# CREATE TABLESPACE tbs_data1 RELATIVE LOCATION 'tablespace1/tbs_data1'; --修改test_alt1表的空间为tbs_data1。 gaussdb=# ALTER TABLE test_schema.test_alt1 SET TABLESPACE tbs_data1; --查看。 gaussdb=# SELECT tablename, tablespace FROM pg_tables WHERE tablename = 'test_alt1'; tablename | tablespace -----------+------------ test_alt1 | tbs_data1 (1 row) --创建表 gaussdb=# CREATE TABLE test(c1 int, c2 int); --在线修改test表的空间为tbs_data1。 gaussdb=# ALTER TABLE ONLINE test SET TABLESPACE tbs_data1; --查看。 gaussdb=# SELECT tablename, tablespace FROM pg_tables WHERE tablename = 'test'; tablename | tablespace -----------+------------ test| tbs_data1 (1 row) --删除。 gaussdb=# DROP TABLE test ; gaussdb=# DROP TABLE test_schema.test_alt1; gaussdb=# DROP TABLESPACE tbs_data1; gaussdb=# DROP SCHEMA test_schema; gaussdb=# DROP USER test_user;
  • 语法格式 修改表的定义。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } action [, ... ]; ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name ADD ( { column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] } [, ... ] ); ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ... ] ); ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name RENAME [TO | AS | = ] new_table_name; RENAME {TABLE | TABLES} {table_name TO new_table_name} [, ... ]; ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } RENAME [ COLUMN ] column_name TO new_column_name; ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } RENAME CONSTRAINT constraint_name TO new_constraint_name; ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name SET SCHEMA new_schema; ALTER TABLE [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name GSIWAITALL; 其中具体表操作ACTION可以是以下子句之一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 column_clause | ADD table_constraint [ NOT VALID ] | ADD table_constraint_using_index | VALIDATE CONSTRAINT constraint_name | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] | DROP PRIMARY KEY | CLUSTER ON index_name | SET WITHOUT CLUSTER | SET ( {storage_parameter = value} [, ... ] ) | RESET ( storage_parameter [, ... ] ) | OWNER TO new_owner | SET TABLESPACE new_tablespace | TO { GROUP groupname | NODE ( nodename [, ... ] ) } | ADD NODE ( nodename [, ... ] ) | DELETE NODE ( nodename [, ... ] ) | UPDATE SLICE LIKE table_name | DISABLE TRIGGER [ trigger_name | ALL | USER ] | ENABLE TRIGGER [ trigger_name | ALL | USER ] | ENABLE REPLICA TRIGGER trigger_name | ENABLE ALWAYS TRIGGER trigger_name | ENABLE ROW LEVEL SECURITY | DISABLE ROW LEVEL SECURITY | FORCE ROW LEVEL SECURITY | NO FORCE ROW LEVEL SECURITY | REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING } | AUTO_INCREMENT [ = ] value | COMMENT [ = ] 'string' | [ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ] | ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )] | [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE | DISABLE | DELETE } POLICY policy_name | [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE_ALL | DISABLE_ALL | DELETE_ALL} | htap_action [ ( { column_name [, ... ]} ) ] [ PRIORITY { HIGH | LOW | NONE } ] ADD table_constraint [ NOT VALID ] 给表增加一个新的约束。 ADD table_constraint_using_index 根据已有唯一索引为表增加主键约束或唯一约束。当指定索引为GSI时,将报错,需要使用BY GLOBAL INDEX语法添加GSI索引约束。 VALIDATE CONSTRAINT constraint_name 验证一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] 删除一个表上的约束。 DROP PRIMARY KEY 删除一个表上的主键约束。该语法仅在sql_compatibility='MYSQL'时有效。 CLUSTER ON index_name 为将来的CLUSTER(聚簇)操作选择默认索引。实际上并没有重新盘簇化处理该表。 SET WITHOUT CLUSTER 从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的CLUSTER(聚簇)操作。 SET ( {storage_parameter = value} [, ... ] ) 修改表的一个或多个存储参数。当table_name为索引名时,ACTIVE_PAGES表示索引的页面数量,可能比实际的物理文件页面少,可以用于优化器调优。目前只对Ustore的分区表LOCAL索引生效,且会被VACUUM、ANALYZE更新(包括AUTO VACUUM)。不建议用户手动设置该参数,该参数在分布式下无效。 RESET ( storage_parameter [, ... ] ) 重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重写表才能获得想要的效果。 OWNER TO new_owner 将表、序列、视图的属主改变成指定的用户。 SET TABLESPACE new_tablespace 这种形式将表空间修改为指定的表空间并将相关的数据文件移动到新的表空间。但是表上的所有索引都不会被移动,索引可以通过ALTER INDEX语法的SET TABLESPACE选项来修改索引的表空间。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } 此语法仅在扩展模式(GUC参数support_extended_features为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。该命令只会修改表分布节点的逻辑映射关系,并未真正在DN节点上迁移表的元数据和数据。 ADD NODE ( nodename [, ... ] ) 此语法主要供内部扩容工具使用,一般用户不建议使用。 DELETE NODE ( nodename [, ... ] ) 此语法主要供内部缩容工具使用,一般用户不建议使用。 UPDATE SLICE LIKE table_name 此语法主要供内部扩缩容工具使用,一般用户不可以使用。 DISABLE TRIGGER [ trigger_name | ALL | USER ] 禁用trigger_name所表示的单个触发器,或禁用所有触发器,或仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如,可延迟唯一性和排除约束的约束触发器)。 应谨慎使用此功能,因为如果不执行触发器,则无法保证原先期望的约束的完整性。 | ENABLE TRIGGER [ trigger_name | ALL | USER ] 启用trigger_name所表示的单个触发器,或启用所有触发器,或仅启用用户触发器。 | ENABLE REPLICA TRIGGER trigger_name 触发器触发机制受配置变量session_replication_role的影响,当复制角色为“origin”(默认值)或“local”时,将触发简单启用的触发器。 配置为ENABLE REPLICA的触发器仅在会话处于“replica”模式时触发。 | ENABLE ALWAYS TRIGGER trigger_name 无论当前复制模式如何,配置为ENABLE ALWAYS的触发器都将触发。 | { DISABLE | ENABLE } [ REPLICA | ALWAYS ] RULE 配置属于表的重写规则,已禁用的规则对系统来说仍然是可见的,只是在查询重写期间不被应用。语义为关闭/启动规则。由于关系到视图的实现,ON SELECT规则不可禁用。 配置为ENABLE REPLICA的规则将会仅在会话为“replica” 模式时启动,而配置为ENABLE ALWAYS的触发器将总是会启动,不考虑当前复制模式。规则触发机制也受配置变量session_replication_role的影响,类似于上述触发器。 | { DISABLE | ENABLE } ROW LEVEL SECURITY 开启或关闭表的行访问控制开关。 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见CREATE ROW LEVEL SECURITY POLICY章节。 | {NO FORCE|FORCE} ROW LEVEL SECURITY 强制开启或关闭表的行访问控制开关。 默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)会受影响。系统管理员可以绕过所有的行访问控制策略,不受影响。 REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING } 在逻辑复制场景下,指定该表的UPDATE和DELETE操作中旧元组的记录级别。 DEFAULT记录主键的列的旧值,没有主键则不记录。 USING INDEX记录命名索引覆盖的列的旧值,这些值必须是唯一的、不局部的、不可延迟的,并且仅包括标记为NOT NULL的列。 FULL记录该行中所有列的旧值。 NOTHING不记录有关旧行的信息。 在逻辑复制场景,解析该表的UPDATE和DELETE操作语句时,以此方法记录的信息组成解析出的旧元组。对于有主键表该选项可设置为DEFAULT或FULL。对于无主键表该选项需设置为FULL,否则解码时旧元组将解析为空。一般场景不建议设置为NOTHING,旧元组会始终解析为空。 针对ustore表,选项NOTHING无效,实际效果等同于FULL;DEFAULT没有主键时,记录该行所有列。 AUTO_INCREMENT [ = ] value 设置自动增长列下一次的自增值。设置的值只有大于当前自增计数器时才会生效。 value必须是非负数,且不得大于2127-1。 此子句仅在参数sql_compatibility='MYSQL'时生效。 [ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ] 修改表的默认字符集和默认字符序为指定的值。修改不会影响表中当前已经存在的列。 ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER n { day | month | year } OF NO MODIFICATION [ ON ( EXPR )] 在表上追加一个ILM策略,一个完整的ILM策略由两部分构成,ILM动作和ILM条件。ILM动作用于定义具体的数据压缩或移动行为,ILM条件用于定义数据满足什么条件时会触发ILM动作,ILM条件为行级条件,即ILM条件作用于堆表中的每一行,当前行一段时间内未发生修改时,会满足ILM条件,从而触发ILM动作。EXPR仅支持表字段及类型基础操作函数(to_date,substr等)。 [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE | DISABLE | DELETE } POLICY policy_name 修改表(分区或子分区)的单个ILM策略,policy_name是系统视图GS_ADM_ILMOBJE CTS 或GS_MY_ILMOBJECTS查询得到的POLICY_NAME。 [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE_ALL | DISABLE_ALL | DELETE_ALL} 修改表(分区或子分区)的所有ILM策略。 其中列相关的操作column_clause可以是以下子句之一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | MODIFY column_name data_type | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | MODIFY column_name [ CONSTRAINT constraint_name ] NULL | MODIFY column_name data_type { { [ COMMENT 'string' ] [ ... ] } | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL | ALTER [ COLUMN ] column_name SET STATIS TICS [PERCENT] integer | ADD STATISTI CS (( column_1_name, column_2_name [, ...] )) | DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] 向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。如果指定IF NOT EXISTS关键字,如果存在相同名称的列,返回NOTICE提示,告知列已存在。未指定IF NOT EXISTS关键字时,如果存在相同名称的列,返回ERROR报错。 ADD ( { column_name data_type [ compress_mode ] } [, ...] ) 向表中增加多列。 MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] ) 修改表已存在字段的数据类型。此命令会导致该字段的统计信息清空,建议在修改后重新收集该列的统计信息。 MODIFY column_name data_type { { [ COMMENT 'string' ] [ ... ] } 修改表格已存在字段的定义,用新的定义替换字段的原定义,原字段上的索引、独立对象约束(例如:主键、唯一键、CHECK约束等)不会被删除。 此语法只能在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')使用。 此语法不支持外表、修改加密字段。 不支持修改分区键字段的数据类型和排序规则,不支持修改规则引用的字段的数据类型和排序规则,不支持修改物化视图引用的字段的数据类型和排序规则。 被修改数据类型或排序规则的字段如果被一个生成列引用,那么这个生成列的数据将会重新生成。 被修改字段若被一些对象依赖(如:索引、独立对象约束、视图、触发器、行级访问控制策略等),修改字段过程中将会重建这些对象。若被修改后字段定义违反此类对象的约束,修改操作会失败,如:修改作为视图结果列的字段的数据类型。请修改字段前评估这类影响。 HASH、LIST、RANGE分布场景下不支持修改分布列数据类型和其注释。 被修改字段若被一些对象调用(如:自定义函数、存储过程等),修改字段不会处理这些对象。修改字段后,这些对象有可能出现不可用的情况,请修改字段前评估这类影响。 此子句与上一子句中“MODIFY column_name data_type”部分语法相同,语义功能不同,当GUC参数b_format_behavior_compat_options含有‘enable_modify_column’选项时,将按照此子句功能处理。 此命令会导致该字段的统计信息清空,建议在修改后重新收集该列的统计信息。 DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图等。 DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。 ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] 改变表字段的数据类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 当字段的原始数据类型和修改后的数据类型二进制兼容时,执行该语句不需要对整表进行重写,其他场景下会进行整表重写。原类型和目标类型是否二进制兼容可以在PG_CAST系统表中查看,如果castmethod为‘b’则二进制兼容。例如源表中数据类型是text类型,如果转为int类型则会触发表重写,转为clob类型则不会触发表重写。如果表重写被触发,该表上被删除的空间也将被立刻回收。 此命令会导致该字段的统计信息清空,建议在修改后重新收集该列的统计信息。 ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } 为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的INSERT命令,它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT规则应用之前插入到INSERT句中的。 ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL 修改一个字段是否允许NULL值或者拒绝NULL值。如果表在字段中包含非NULL,则只能使用SET NOT NULL。 ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer 为随后的ANALYZE操作设置针对每个字段的统计收集目标。目标的范围可以在0到10000之内设置。设置为-1时表示重新恢复到使用系统缺省的统计目标。 {ADD | DELETE} STATISTICS ((column_1_name, column_2_name [, ...])) 用于添加和删除多列统计信息声明(不实际进行多列统计信息收集),以便在后续进行全表或全库analyze时进行多列统计信息收集。每组多列统计信息最多支持32列。不支持添加/删除多列统计信息声明的表:系统表、外表。 ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) 设置/重置属性选项。 目前,属性选项只定义了n_distinct和n_distinct_inherited。n_distinct影响表本身的统计值,而n_distinct_inherited影响表及其继承子表的统计。目前,只支持SET/RESET n_distinct参数,禁止SET/RESET n_distinct_inherited参数。 ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 其中列约束column_constraint为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | ON UPDATE update_expr | GENERATED ALWAYS AS ( generation_expr ) [STORED] | AUTO_INCREMENT | COMMENT 'string' | COLVIEW | NOCOLVIEW | UNIQUE [KEY] index_parameters | PRIMARY KEY index_parameters | ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | REFEREN CES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中htap_action为: COLVIEW | COLVIEW NOCOLVIEW | NOCOLVIEW | NOCOLVIEW COLVIEW 其中索引参数index_parameters为: 1 2 [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ] 其中update_expr为: { CURRENT_TIMESTAMP | LOCALTIMESTAMP | NOW() } 其中列的压缩可选项compress_mode为: 1 { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } 其中根据已有唯一索引为表增加主键约束或唯一约束table_constraint_using_index为: 1 2 3 [ CONSTRAINT constraint_name ] { UNIQUE | PRIMARY KEY } USING INDEX index_name [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中表约束table_constraint为: 1 2 3 4 5 6 7 [ CONSTRAINT [ constraint_name ] ] { CHECK ( expression ) | UNIQUE [ idx_name ] [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ ASC | DESC ] } [, ... ] ) index_parameters | PRIMARY KEY [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) index_parameters | FOREIGN KEY [ idx_name ] ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ENFORCED ] { [ COMMENT 'string' ] [ ... ] } NOT ENFORCED语法表示创建的约束为信息约束,即数据库只记录该约束信息而并不对数据进行强制约束,主要用于为优化器提供优化所需信息。目前仅支持UNIQUE KEY、PRIMARY KEY以及FOREIGN KEY。 其中索引参数index_parameters为: 1 2 [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ][BY GLOBAL INDEX] 当index_parameters指定BY GLOBAL INDEX时,将使用全局二级索引建立约束。
  • 注意事项 基表为HASH分布时,若创建不包含基表分布键的主键或唯一索引,需要使用全局二级索引(指定BY GLOBAL INDEX字段),若创建包含基表分布键的主键或唯一索引,需要使用普通索引(不指定BY GLOBAL INDEX字段),单DN部署形式下,使用全局二级索引或者普通索引均可创建成功;当基表为除HASH分布以外的其他分布形式时,主键或唯一索引只能使用普通索引,即索引键必须包含基表分布键。 表的所有者、被授予了表ALTER权限的用户或被授予ALTER ANY TABLE权限的用户有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。但要修改表的所有者或者修改表的模式,当前用户必须是该表的所有者或者系统管理员,且该用户是新所有者角色的成员。 不能修改分区表的TABLESPACE,但可以修改分区的TABLESPACE。 不支持修改存储参数ORIENTATION。 SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。 不允许对表的分布列(distribute column)进行修改。 不支持对分区表的分区键字段改变和转换字符集。
  • 示例 修改模式名称。 --将模式test_schema1重命名为test_sch1。 gaussdb=# ALTER SCHEMA test_schema1 RENAME TO test_sch1; --查询模式信息。 gaussdb=# \dn+ test* List of schemas Name | Owner | Access privileges | Description | WithBlockChain -----------+-------+-------------------+-------------+---------------- test_sch1 | omm | | | t (1 row) 修改模式所有者。 --创建用户test_user。 gaussdb=# CREATE ROLE test_user PASSWORD '********'; --将模式test_sch1的所有者修改为test_user。 gaussdb=# ALTER SCHEMA test_sch1 OWNER TO test_user; --查询模式信息。 gaussdb=# \dn+ test_sch1; List of schemas Name | Owner | Access privileges | Description | WithBlockChain -----------+-----------+-------------------+-------------+---------------- test_sch1 | test_user | | | t (1 row) --删除。 gaussdb=# DROP SCHEMA test_sch1; gaussdb=# DROP ROLE test_user; 修改默认字符集和字符序。 仅在B模式数据库下(即sql_compatibility = 'B')支持该语法。 除binary字符集和字符序外,当前仅支持指定与数据库编码相同的字符集。 --创建并切换至测试数据库。 gaussdb=# CREATE DATABASE test1 WITH DBCOMPATIBILITY = 'B' ENCODING = 'UTF8' LC_COLLATE = 'zh_CN.utf8' LC_CTYPE = 'zh_CN.utf8'; gaussdb=# \c test1 --创建模式test_sch2。 test1=# CREATE SCHEMA test_sch2; --修改其默认字符为utf8mb4,默认字符序修改为utf8mb4_bin。 test1=# ALTER SCHEMA test_sch2 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; --删除。 test1=# DROP SCHEMA test_sch2; --切换至默认数据库。(根据实际情况修改数据库名) test1=# \c postgres gaussdb=# DROP DATABASE test1;
  • 注意事项 只有模式的所有者或者被授予了模式ALTER权限的用户有权限执行ALTER SCHEMA命令,三权分立开关关闭时,系统管理员默认拥有此权限。但要修改模式的所有者,当前用户必须是该模式的所有者或者系统管理员,且该用户是新所有者角色的成员。 对于除public以外的系统模式,如pg_catalog、sys等,只允许初始用户修改模式的所有者。修改系统自带模式的名称可能会导致部分功能不可用甚至影响数据库正常运行,默认情况下不允许修改系统自带模式的名称,考虑到前向兼容性,仅允许当系统在启动或升级过程中或参数allow_system_table_mods为on时修改。 除初始用户外,其他用户无法将schema的所有者修改为运维管理员。
  • 参数说明 schema_name 现有模式的名称。 取值范围:已存在的模式名。 RENAME TO new_name 修改模式的名称。非系统管理员要改变模式的名称,则该用户必须在此数据库上有CREATE权限。 new_name:模式的新名称。 模式名不能和当前数据库里其他的模式重名。 模式名不能和当前数据库的初始用户重名。 模式的名称不可以“pg_”开头。 模式的名称不可以“gs_role_”开头。 取值范围:字符串,要符合标识符命名规范。 OWNER TO new_owner 修改模式的所有者。非系统管理员要改变模式的所有者,该用户还必须是新的所有角色的直接或间接成员, 并且该成员必须在此数据库上有CREATE权限。 new_owner:模式的新所有者。 取值范围:已存在的用户名/角色名。 { WITH | WITHOUT } BLOCKCHAIN 修改模式的防篡改属性,使用WITH选项为防篡改模式。具有防篡改属性模式下的普通行存表均为防篡改历史表,不包括外表,临时表,系统表。当该模式下不包含任何表时才可修改防篡改属性。另外,不支持临时表模式、toast表模式、dbe_perf模式、blockchain模式修改防篡改属性。只有模式中不包含任何表的情况下,才能使用该语法在普通模式和防篡改模式中互转。 修改普通模式为防篡改模式,需设置GUC参数enable_ledger为on,该参数默认值为off,级别为SIGHUP。
  • 示例 --创建集群节点,在所有CN上执行。 gaussdb=# CREATE NODE datanode1 WITH( TYPE = datanode, PREFERRED = false ); --查询集群DN初始状态。 gaussdb=# SELECT node_name, nodeis_preferred FROM pgxc_node WHERE node_type = 'D' ORDER BY 1; node_name | nodeis_preferred -----------+------------------ datanode1 | f datanode2 | f (2 rows) --将datanode1设为preferred DN。 gaussdb=# ALTER NODE datanode1 WITH(preferred = true); --查询集群DN变更后状态。 gaussdb=# SELECT node_name, nodeis_preferred FROM pgxc_node WHERE node_type = 'D' ORDER BY 1; node_name | nodeis_preferred -----------+------------------ datanode1 | t datanode2 | f (2 rows) --删除集群节点,连接一个CN即可。 gaussdb=# DROP NODE datanode1;
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ALTER NODE nodename WITH ( [ TYPE = nodetype,] [ HOST = hostname,] [ PORT = portnum,] [ HOST1 = 'hostname',] [ PORT1 = portnum,] [ HOSTPRIMARY [ = boolean ],] [ PRIMARY [ = boolean ],] [ PREFERRED [ = boolean ],] [ SCTP_PORT = portnum,] [ CONTROL_PORT = portnum,] [ SCTP_PORT1 = portnum,] [ CONTROL_PORT1 = portnum, ] [ NODEIS_CENTRAL [ = boolean ],] [ NODEIS_ACTIVE [= boolean] ] ); PORT选项指定的端口号为节点间内部通信绑定的端口号,不同于外部客户端连接节点的端口号,可通过pgxc_node表查询。
  • 参数说明 nodename 节点名称。 取值范围:字符串,要符合标识符命名规范。 TYPE = nodetype 指定节点的类型。 取值范围: 'coordinator' 'datanode' HOST = hostname 指定节点对应的主机名称或者IP地址。 PORT = portnum 指定节点绑定的主机端口号。 HOST1 = hostname 指定节点对应的备机名称或者IP地址。 PORT1 = portnum 指定节点绑定的备机端口号。 HOSTPRIMARY 声明主机名称或者IP地址是否为主。 取值范围: true false(默认值) PRIMARY = boolean 声明该节点是否为主节点。主节点允许做读写操作,否则只允许读操作。 取值范围: true false(默认值) PREFERRED = boolean 声明该节点是否为读操作的首选节点。 取值范围: true false(默认值) SCTP_PORT = portnum 主机TCP代理通信库使用的数据传输通道侦听端口,使用TCP协议侦听连接。 CONTROL_PORT = portnum 主机TCP代理通信库使用的控制传输通道侦听端口,使用TCP协议侦听连接。 SCTP_PORT1 = portnum 备机TCP代理通信库使用的数据传输通道侦听端口,使用TCP协议侦听连接。 CONTROL_PORT 1= portnum 备机TCP代理通信库使用的控制传输通道侦听端口,使用TCP协议侦听连接。 NODEIS_CENTRAL 表明当前节点是否为中心控制节点,只用于CN,对DN无效。 true false(默认值) NODEIS_ACTIVE 表明当前节点是否是正常状态,用于标记CN是否被剔除,对DN无效。 true false(默认值) 多CN环境下,创建集群节点时只会在当前连接的CN下创建,不会同步至其他CN,需要在所有CN上执行,如果删除集群节点只需要链接一个CN即可。如果只在其中一个CN执行创建了集群节点,要删除需要定义当前cnnodename,并在当前CN下执行删除操作。请参考DROP NODE。
  • 示例 --创建并切换至测试数据库。 gaussdb=# CREATE DATABASE test_event WITH DBCOMPATIBILITY = 'b'; gaussdb=# \c test_event --创建表。 test_event=# CREATE TABLE t_ev(num int); --创建一个状态为DISABLE的定时任务,表示此定时任务不开启。 test_event=# CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE AT sysdate + interval 5 second DISABLE DO insert into t_ev values(0); --查询定时任务,ENABLE值为'f'。 test_event=# SHOW EVENTS; job_name | schema_name | log_user | priv_user | job_status | start_date | interval | end_date | enable | failure_msg ----------+-------------+----------+-----------+------------+---------------------+----------+---------------------+--------+------------- event_e1 | public | omm | omm | s | 2023-11-28 09:10:58 | null | 3999-12-31 16:00:00 | f | (1 row) --修改定时任务状态为ENABLE,并五秒后查询表。 test_event=# ALTER EVENT event_e1 ENABLE; test_event=# SELECT * FROM t_ev; num ----- 0 (1 row) --创建一个每隔一分钟执行一次的定时任务。 test_event=# CREATE EVENT IF NOT EXISTS event_e2 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(1); --每隔一分钟查询表,会看到新增一条数据。 test_event=# SELECT * FROM t_ev; num ----- 0 1 1 (3 rows) --修改定时任务中待执行语句并查询表。 test_event=# ALTER EVENT event_e2 DO insert into t_ev values(3); test_event=# SELECT * FROM t_ev; num ----- 0 1 1 3 (4 rows) --修改定时任务名称。 test_event=# ALTER EVENT event_e2 RENAME TO event_ee; --删除定时任务。 test_event=# DROP EVENT event_ee; --删除表。 test_event=# DROP TABLE t_ev; --切换回初始数据库,并删除测试数据库。请用真实的数据库名替换postgres。 test_event=# \c postgres gaussdb=# DROP DATABASE test_event;
  • 参数说明 DEFINER 定时任务待执行语句在执行时使用的权限。默认情况下使用当前创建定时任务者的权限,当definer被指定时,使用被指定用户user的用户权限。 definer参数只有具有sysadmin权限的用户有权指定。 ON SCHEDULE 定时任务执行时刻。其中schedule子句与CREATE EVENT中schedule一致。 RENAME TO 更新定时任务名。 ON COMPLETION [NOT] PRESERVE 默认情况下,一旦事务处于完成状态,系统表中就会立刻删除该定时任务。用户可以通过设置ON COMPLETION PRESERVE来覆盖默认行为。 ENABLE | DISABLE | DISABLE ON SLAVE 创建定时任务后,定时任务默认处于ENABLE状态,即到规定时间立即执行待执行语句。用户可以使用DISABLE关键字,改变定时任务的活动状态。DISABLE ON SLAVE表现与DISABLE一致。 COMMENT 用户可以给定时任务添加注释,注释内容在GS_JOB_ATTRIBUTE表中查看。 DO 定时任务待执行语句。 interval 时间间隔。interval的取值可以使用下划线代替TO。例如,YEAR_MONTH、DAY_HOUR等。 该参数在B兼容模式下,GUC参数b_format_version = '5.7'、b_format_dev_version = 's1'时才可使用。
  • 注意事项 定时任务相关操作只有sql_compatibility = 'B'时支持。 只有定时任务的所有者有权修改对应的定时任务,系统管理员默认拥有修改所有定时任务的权限。 可以通过SHOW EVENTS或在PG_JOB表中查看log_user列来获得job的所有者信息。 每次修改定时任务成功后,会更新被修改job的所有者为当前用户,若修改定时任务时指定了definer,则更新为被指定的definer。 definer选项场景限制与CREATE EVENT章节中对definer限制场景一致。 系统管理员修改其他用户创建的定时任务后,被修改定时任务的所有者将切换为系统管理员,待执行语句将使用系统管理员的权限执行。
  • 语法格式 ALTER [DEFINER = user] EVENT event_name [ON SCHEDULE schedule] [ON COMPLETION [NOT] PRESERVE] [RENAME TO new_event_name] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'string'] [DO event_body]; schedule: 1 2 3 4 5 6 { AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] } interval: quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | YEAR TO MONTH | DAY TO HOUR | DAY TO MINUTE | DAY TO SECOND | HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND}