华为云用户手册

  • 语法格式 设置视图列的默认值。 1 2 ALTER VIEW [ IF EXISTS ] view_name ALTER [ COLUMN ] column_name SET DEFAULT expression; 取消列视图列的默认值。 1 2 ALTER VIEW [ IF EXISTS ] view_name ALTER [ COLUMN ] column_name DROP DEFAULT; 修改视图的所有者。 1 2 ALTER VIEW [ IF EXISTS ] view_name OWNER TO new_owner; 重命名视图,支持新视图名前带有原视图所在的schema名,不支持同时修改schema名。 1 2 3 4 ALTER VIEW [ IF EXISTS ] view_name RENAME TO new_name; ALTER VIEW [ IF EXISTS ] view_name RENAME TO schema.new_name; 设置视图的所属模式。 1 2 ALTER VIEW [ IF EXISTS ] view_name SET SCHEMA new_schema; 设置视图的选项。 1 2 ALTER VIEW [ IF EXISTS ] view_name SET ( { view_option_name [ = view_option_value ] } [, ... ] ); 重置视图的选项。 1 2 ALTER VIEW [ IF EXISTS ] view_name RESET ( view_option_name [, ... ] );
  • 示例 修改用户jim的登录密码: 1 ALTER USER jim IDENTIFIED BY '{password}' REPLACE '{old_password}'; 为用户jim追加CREATEROLE权限: 1 ALTER USER jim CREATEROLE; 将与用户jim关联的会话参数enable_seqscan的值设置为on, 设置成功后,在下一会话中生效: 1 ALTER USER jim SET enable_seqscan TO on; 重置jim的enable_seqscan参数: 1 ALTER USER jim RESET enable_seqscan; 锁定jim账户: 1 ALTER USER jim ACCOUNT LOCK;
  • 语法格式 修改用户的权限等信息。 1 ALTER USER user_name [ [ WITH ] option [ ... ] ]; 其中option子句为。 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 { CREATEDB | NOCREATEDB } | { CREATEROLE | NOCREATEROLE } | { INHERIT | NOINHERIT } | { AUDITADMIN | NOAUDITADMIN } | { SYSADMIN | NOSYSADMIN } | { USEFT | NOUSEFT } | { LOG IN | NOLOGIN } | { REPLICATION | NOREPLICATION } | {INDEPENDENT | NOINDEPENDENT} | {VCADMIN | NOVCADMIN} | CONNECTION LIMIT connlimit | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' | DISABLE } | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' ] | DISABLE } | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' | TEMP SPACE 'tmpspacelimit' | SPILL SPACE 'spillspacelimit' | NODE GROUP logic_cluster_name | ACCOUNT { LOCK | UNLOCK } | PGUSER | AUTHINFO 'authinfo' | PASSWORD EXPIRATION period 修改用户名。 1 2 ALTER USER user_name RENAME TO new_name; 修改与用户关联的指定会话参数值。 1 2 ALTER USER user_name SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; 重置与用户关联的指定会话参数值。 1 2 ALTER USER user_name RESET { configuration_parameter | ALL };
  • 示例 重命名数据类型: 1 ALTER TYPE compfoo RENAME TO compfoo1; 修改用户定义类型compfoo1的所有者为usr1: 1 ALTER TYPE compfoo1 OWNER TO usr1; 把用户定义类型compfoo1的模式改为usr1: 1 ALTER TYPE compfoo1 SET SCHEMA usr1; 给数据类型compfoo1增加一个新的属性f3: 1 ALTER TYPE compfoo1 ADD ATTRIBUTE f3 int; 给枚举类型bugstatus添加一个标签值: 1 ALTER TYPE bugstatus ADD VALUE IF NOT EXISTS 'regress' BEFORE 'closed'; 重命名枚举类型bugstatus的一个标签值: 1 ALTER TYPE bugstatus RENAME VALUE 'create' TO 'new';
  • 参数说明 name 一个需要修改的现有的类型的名字(可以有模式修饰) 。 new_name 该类型的新名称。 new_owner 新所有者的用户名 。 new_schema 该类型的新模式 。 attribute_name 拟增加、更改或删除的属性的名称。 new_attribute_name 拟改名的属性的新名称。 data_type 拟新增属性的数据类型,或是拟更改的属性的新类型名。 new_enum_value 枚举类型新增加的标签值,是一个非空的长度不超过64个字节的字符串。 neighbor_enum_value 一个已有枚举标签值,新值应该被增加在紧接着该枚举值之前或者之后的位置上。 existing_enum_value 现有的要重命名的枚举值,是一个非空的长度不超过64个字节的字符串 CASCADE 自动级联更新需更新类型以及相关联的记录和继承它们的子表。 RESTRICT 如果需联动更新类型是已更新类型的关联记录,则拒绝更新。这是缺省选项。 ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时执行。 例如,在一条命令中同时增加多个属性或是更改多个属性的类型。 要使用ALTER TYPE,必须是该类型的所有者。 要修改类型的模式,还必须在新模式上拥有CREATE权限。 要修改所有者,必须是新的所有角色的直接或间接成员, 并且该角色必须在此类型的模式上有CREATE权限。 (这些限制强制要求修改所有者不能执行任何通过删除和重建该类型无法实现的操作。 不过,系统管理员拥有以任何方式修改任意类型的所有权。) 要增加一个属性或是修改一个属性的类型,也必须有该类型的USAGE权限。
  • 语法格式 修改类型 1 2 3 4 5 6 7 8 9 10 11 12 ALTER TYPE name action [, ... ] ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ] ALTER TYPE name RENAME TO new_name ALTER TYPE name SET SCHEMA new_schema ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ] ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value where action is one of: ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ] ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] 给复合类型增加新的属性。 1 ALTER TYPE name ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
  • 示例 修改触发器delete_trigger: 1 ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; 禁用触发器insert_trigger: 1 ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; 禁用当前表test_trigger_src_tbl所有触发器: 1 ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL;
  • 语法格式 修改词典定义。 1 2 3 ALTER TEXT SEARCH DICTIONARY name ( option [ = value ] [, ... ] ); 重命名词典。 1 ALTER TEXT SEARCH DICTIONARY name RENAME TO new_name; 设置词典的所属模式。 1 ALTER TEXT SEARCH DICTIONARY name SET SCHEMA new_schema; 修改词典的所属者。 1 ALTER TEXT SEARCH DICTIONARY name OWNER TO new_owner;
  • 参数说明 name 已存在的词典名(可指定模式名,否则默认在当前模式下)。 取值范围:已存在的词典名。 option 要修改的参数名。与template对应,不同的词典类型具有不同的参数列表,且与指定顺序无关。详细参数说明请见option。 不支持修改词典的TEMPLATE参数值。 不支持仅修改FILEPATH参数而不修改对应的词典定义文件参数。 词典定义文件的文件名仅支持小写字母、数据、下划线混合。 value 要修改的参数值。如果省略等号(=)和value,则表示删除该option的先前设置,使用默认值。 取值范围:对应option定义。 new_name 词典的新名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 new_owner 词典新的所有者。 取值范围:已存在的用户。 new_schema 词典的新模式。 取值范围:已存在的模式。
  • 示例 更改Snowball类型字典的停用词定义,其他参数保持不变。 1 ALTER TEXT SEARCH DICTIONARY my_dict ( StopWords = newrussian, FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); 更改Snowball类型字典的Language参数,并删除停用词定义。 1 ALTER TEXT SEARCH DICTIONARY my_dict ( Language = dutch, StopWords ); 更新词典定义,不实际更改任何内容。 1 ALTER TEXT SEARCH DICTIONARY my_dict ( dummy );
  • 语法格式 增加文本搜索配置字串类型映射语法 1 2 ALTER TEXT SEARCH CONFIGURATION name ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]; 修改文本搜索配置字典语法 1 2 ALTER TEXT SEARCH CONFIGURATION name ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary; 修改文本搜索配置字串类型语法 1 2 ALTER TEXT SEARCH CONFIGURATION name ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]; 更改文本搜索配置字典语法 1 2 ALTER TEXT SEARCH CONFIGURATION name ALTER MAPPING REPLACE old_dictionary WITH new_dictionary; 删除文本搜索配置字串类型映射语法 1 2 ALTER TEXT SEARCH CONFIGURATION name DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]; 重命名文本搜索配置所有者语法 1 ALTER TEXT SEARCH CONFIGURATION name OWNER TO new_owner; 重命名文本搜索配置名称语法 1 ALTER TEXT SEARCH CONFIGURATION name RENAME TO new_name; 重命名文本搜索配置命名空间语法 1 ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA new_schema; 修改文本搜索配置属性语法 1 ALTER TEXT SEARCH CONFIGURATION name SET ( { configuration_option = value } [, ...] ); 重置文本搜索配置属性语法 1 ALTER TEXT SEARCH CONFIGURATION name RESET ( {configuration_option} [, ...] ); ADD MAPPING FOR选项为文本搜索配置增加字串类型映射;如果ADD MAPPING FOR后面任何一个字串类型的映射已经存在于此文本搜索配置中,那么系统将会报错。 ALTER MAPPING FOR选项会首先清除已有的字串类型映射,然后添加指定的字串类型映射。 ALTER MAPPING REPLACE ... WITH ... 与ALTER MAPPING FOR ... REPLACE ... WITH ...选项会直接使用new_dictionary替换old_dictionary。需要注意的是,只有pg_ts_config_map系统表中存在maptokentype与old_dictionary对应关系的元组时,才能更新成功,否则不会成功,也不会有任何提示信息返回。 DROP MAPPING FOR选项会删除当前文本搜索配置中指定的字串类型映射。 如果没有指定IF EXISTS选项,当DROP MAPPING FOR选项指定的字串类型映射在文本搜索配置中不存在时,数据库会报错。
  • 参数说明 name 已有文本搜索配置的名称(可以有模式修饰)。 token_type 与配置的语法解析器关联的字串类型的名称。详细信息参见解析器。 dictionary_name 文本搜索字典名称。 如果有多个字典,则它们会按指定的顺序搜索。 old_dictionary 映射中拟被替换的文本搜索字典名称。 new_dictionary 替换old_dictionary的文本搜索字典的名称。 new_owner 文本搜索配置的新所有者。 new_name 文本搜索配置的新名称。 new_schema 文本搜索配置的新模式名。 configuration_option 文本搜索配置项。详细信息参见CREATE TEXT SEARCH CONFIGURATION。 value 文本搜索配置项的值。
  • 示例 给文本搜索类型ngram1添加类型映射: 1 ALTER TEXT SEARCH CONFIGURATION ngram1 ADD MAPPING FOR multisymbol WITH simple; 修改文本搜索配置的所有者: 1 ALTER TEXT SEARCH CONFIGURATION ngram1 OWNER TO joe; 修改文本搜索配置的schema: 1 ALTER TEXT SEARCH CONFIGURATION ngram1 SET SCHEMA joe; 重命名文本搜索配置: 1 ALTER TEXT SEARCH CONFIGURATION joe.ngram1 RENAME TO ngram_1; 删除类型映射: 1 ALTER TEXT SEARCH CONFIGURATION joe.ngram_1 DROP MAPPING IF EXISTS FOR multisymbol; 增加文本搜索配置字串类型映射语法: 1 ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR word WITH simple,english_stem; 增加文本搜索配置字串类型映射语法: 1 ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR email WITH english_stem, french_stem; 修改文本搜索配置字串类型映射语法: 1 ALTER TEXT SEARCH CONFIGURATION english_1 ALTER MAPPING REPLACE french_stem with german_stem; 查询文本搜索配置相关信息: 1 2 3 4 5 6 7 8 SELECT b.cfgname,a.maptokentype,a.mapseqno,a.mapdict,c.dictname FROM pg_ts_config_map a,pg_ts_config b, pg_ts_dict c WHERE a.mapcfg=b.oid AND a.mapdict=c.oid AND b.cfgname='english_1' ORDER BY 1,2,3,4,5; cfgname | maptokentype | mapseqno | mapdict | dictname -----------+--------------+----------+---------+-------------- english_1 | 2 | 1 | 3765 | simple english_1 | 2 | 2 | 12960 | english_stem english_1 | 4 | 1 | 12960 | english_stem english_1 | 4 | 2 | 12966 | german_stem (4 rows)
  • 参数说明 table_name 分区表名。 取值范围:已存在的分区表名。 partition_name 分区名。 取值范围:已存在的分区名。 partition_value 分区键值。 通过PARTITION FOR ( partition_value [, ...] )子句指定的这一组值,可以唯一确定一个分区。 取值范围:需要进行重命名的分区的分区键的取值范围。 UNUSABLE LOCAL INDEXES 设置该分区上的所有索引不可用。 REBUILD UNUSABLE LOCAL INDEXES 重建该分区上的所有索引。 WITHOUT UNUSABLE 重建该分区上的索引时,忽略UNUSABLE状态的索引。该参数仅8.3.0.100及以上集群版本支持。 ENABLE/DISABLE ROW MOVEMENT 行迁移开关。 取值范围: ENABLE:打开行迁移开关。 DISABLE:关闭行迁移开关。 默认是关闭状态。 ENABLE ROW MOVEMENT开启则允许跨分区更新,但此时如果有SELECT FOR UPDATE查询该分区表并发执行,存在查询结果瞬时不一致的可能性,需要谨慎使用。 如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。 ordinary_table_name 进行迁移的普通表的名称。 取值范围:已存在的普通表名。 { WITH | WITHOUT } VALIDATION 在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。 取值范围: WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。 WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。 默认是WITH状态。 由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。 交换的数据不符合分区条件会导致数据异常,如果该表上存在物化视图,也会导致物化视图的数据与原表不一致。 VERBOSE 在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。 partition_new_name 分区的新名字。 取值范围:字符串,要符合标识符的命名规范。
  • 示例 add_clause子句用于为指定的分区表添加一个或多个分区。 为范围分区表customer_address增加分区ca_address_sk介于700和900之间: 1 ALTER TABLE customer_address ADD PARTITION P5 VALUES LESS THAN (900); 为范围分区表customer_address增加分区: [5000, 5300), [5300, 5600), [5600, 5900), [5900, 6000): 1 ALTER TABLE customer_address_SE ADD PARTITION p6 START(5000) END(6000) EVERY(300); 为范围分区表customer_address增加MAXVALUE分区p6: 1 ALTER TABLE customer_address ADD PARTITION p6 END(MAXVALUE); 为列表分区表增加分区P6: 1 ALTER TABLE data_list ADD PARTITION P6 VALUES (202302,202303); modify_clause子句用于设置分区索引是否可用。 给分区表customer_address创建LOCAL索引student_grade_index,并指定分区的索引名称: 1 2 3 4 5 6 7 8 9 CREATE INDEX customer_address_index ON customer_address(ca_address_id) LOCAL ( PARTITION P1_index, PARTITION P2_index, PARTITION P3_index, PARTITION P4_index, PARTITION P5_index, PARTITION P6_index ); 重建分区表customer_address中分区P1上的所有索引: 1 ALTER TABLE customer_address MODIFY PARTITION P1 REBUILD UNUSABLE LOCAL INDEXES; 设置分区表customer_address的分区P3上的所有索引不可用: 1 ALTER TABLE customer_address MODIFY PARTITION P3 UNUSABLE LOCAL INDEXES; split_clause子句用于把一个分区切割成多个分区。 将范围分区表customer_address的P6分区以1200为分割点切分: 1 ALTER TABLE customer_address SPLIT PARTITION P6 AT(1200) INTO (PARTITION P6a,PARTITION P6b); 将范围分区表customer_address中200所在的分区分割成多个分区: 1 ALTER TABLE customer_address SPLIT PARTITION FOR(200) INTO(PARTITION p_part START(100) END(300) EVERY(50)); 将列表分区表data_list的分区P2分割成p2a和p2b两个分区: 1 ALTER TABLE data_list SPLIT PARTITION P2 VALUES(202210) INTO (PARTITION p2a,PARTITION p2b); exchange_clause子句:把普通表的数据迁移到指定的分区。 下面示例演示了把一个普通表math_grade数据迁移到分区表student_grade 中分区(math)的操作。创建分区表student_grade : 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE student_grade ( stu_name char(5), stu_no integer, grade integer, subject varchar(30) ) PARTITION BY LIST(subject) ( PARTITION gym VALUES('gymnastics'), PARTITION phys VALUES('physics'), PARTITION history VALUES('history'), PARTITION math VALUES('math') ); 添加数据到分区表student_grade中: 1 2 3 4 5 6 7 INSERT INTO student_grade VALUES ('Ann', 20220101, 75, 'gymnastics'), ('Jeck', 20220103, 60, 'math'), ('Anna', 20220108, 56, 'history'), ('Jann', 20220107, 82, 'physics'), ('Molly', 20220104, 91, 'physics'), ('Sam', 20220105, 72, 'math'); 查询分区表student_grade的math分区记录: 1 2 3 4 5 6 SELECT * FROM student_grade PARTITION (math); stu_name | stu_no | grade | subject ----------+----------+-------+--------- Jeck | 20220103 | 60 | math Sam | 20220105 | 72 | math (2 rows) 创建一个与分区表student_grade定义匹配的普通表math_grade: 1 2 3 4 5 6 7 CREATE TABLE math_grade ( stu_name char(5), stu_no integer, grade integer, subject varchar(30) ); 添加了数据到表math_grade中。数据与分区表student_grade的math分区的分区规则一致: 1 2 3 4 5 INSERT INTO math_grade VALUES ('Ann', 20220101, 75, 'math'), ('Jeck', 20220103, 60, 'math'), ('Anna', 20220108, 56, 'math'), ('Jann', 20220107, 82, 'math'); 将普通表math_grade数据迁移到分区表student_grade 中分区(math): 1 ALTER TABLE student_grade EXCHANGE PARTITION (math) WITH TABLE math_grade; 对分区表student_grade的查询表明表math_grade中的数据已和分区math中的数据交换: 1 2 3 4 5 6 7 8 SELECT * FROM student_grade PARTITION (math); stu_name | stu_no | grade | subject ----------+----------+-------+--------- Anna | 20220108 | 56 | math Jeck | 20220103 | 60 | math Ann | 20220101 | 75 | math Jann | 20220107 | 82 | math (4 rows) 对表math_grade的查询显示了之前存储在分区math中的记录已被移动到表student_grade中: 1 2 3 4 5 6 SELECT * FROM math_grade; stu_name | stu_no | grade | subject ----------+----------+-------+--------- Jeck | 20220103 | 60 | math Sam | 20220105 | 72 | math (2 rows) truncate_partitioned_clause子语法用于清理表分区的数据。 清空表student_grade分区p1: 1 ALTER TABLE student_grade TRUNCATE PARTITION p1; row_clause子句用于设置分区表的行迁移开关。 打开分区表customer_address的迁移开关: 1 ALTER TABLE customer_address ENABLE ROW MOVEMENT; merge_clause子句用于把多个分区合并成一个分区。 将范围分区表customer_address的P2,P3两个分区合并为一个分区: 1 ALTER TABLE customer_address MERGE PARTITIONS P2, P3 INTO PARTITION P_M; drop_clause子句用于删除分区表中的指定分区。 删除分区表customer_address的分区P6: 1 ALTER TABLE customer_address DROP PARTITION P6; 删除分区表customer_address的多个分区P3,P4,P5: 1 ALTER TABLE customer_address DROP PARTITION P3, P4, P5;
  • 语法格式 修改表分区主语法。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} action [, ... ]; 其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何, GaussDB (DWS)总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。 1 2 3 4 5 6 7 8 9 modify_clause | rebuild_clause | exchange_clause | row_clause | merge_clause | split_clause | add_clause | drop_clause | truncate_partitioned_clause modify_clause子语法用于设置分区索引是否可用。 1 MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES } rebuild_clause子语法用来重建分区的索引。该语法仅8.3.0.100及以上集群版本支持。 1 REBUILD PARTITION partition_name [ WITHOUT UNUSABLE ] exchange_clause子语法用于把普通表的数据迁移到指定的分区。 1 2 3 EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] 进行交换的普通表和分区表必须满足如下条件: 普通表和分区表的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息、已删除字段的数据类型等。 普通表和分区表的表压缩信息严格一致。 普通表和分区表的分布列信息严格一致。 普通表和分区表的索引个数相同,且对应索引的信息严格一致。 普通表和分区表的表约束个数相同,且对应表约束的信息严格一致。 普通表不可以是临时表和unlogged表。 普通表和分区表应该在同一个逻辑集群或节点组(NodeGroup)中,如果不在同一个逻辑集群或节点组,将会采用将数据插入对方表内方式来实现交换分区,这样交换分区的时间与表数据量有关,对于数据量非常大的表和分区表,交换分区将会非常耗时。 在在线扩容重分布场景下,如果普通表和分区表正在重分布,交换分区语句有可能中断正在重分布的普通表或分区表(取决于交换分区和重分布语句是否产生锁冲突),通常重分布的普通表或分区表被中断后会重试2次,但同一个表交换分区执行过于频繁可能导致普通表或分区表多次重试重分布都失败。如果普通表重分布过程被交换分区操作打断,在重试重分布时,数据已经被替换为原分区表中的数据,会重新进行全量重分布。 如果行存分区表中最后一个有效字段后的其他字段全部被删除,在不考虑这些删除字段的情况下,分区表与普通表字段信息一致时,分区表和普通表可以进行交换。 列存普通表和列存分区表的表级参数colversion必须一致:禁止colversion2.0与colversion1.0执行交换分区操作。 完成交换后,普通表和分区表的数据被置换,同时普通表和分区表的表空间信息被置换。此时,普通表和分区表的统计信息变得不可靠,需要对普通表和分区表重新执行analyze。 row_clause子语法用于设置分区表的行迁移开关。 1 { ENABLE | DISABLE } ROW MOVEMENT merge_clause子语法用于把多个分区合并成一个分区。 1 MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name INTO关键字前的分区称为源分区,INTO关键字后的分区称为目标分区。 源分区个数不能小于2个。 源分区名称不能重复。 源分区不能存在unusable的索引,否则执行会报错。 目标分区名只能跟最后一个源分区的名称相同,或者跟表的所有分区名都不相同。 目标分区的边界是所有源分区边界的并集。 对于范围分区表,所有的源分区必须是边界连续的分区。 对于列表分区,如果源分区中包含DEFAULT分区,那么目标分区的边界也是DEFAULT。 split_clause子语法用于把一个分区切割成多个分区。 范围分区的split_clause语法如下: 1 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } 指定切割点split_point_clause的语法为: 1 AT ( partition_value ) INTO ( PARTITION partition_name , PARTITION partition_name ) 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。 不指定切割点no_split_point_clause的语法为。 1 INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) } 不指定切割点的方式,partition_less_than_item指定的第一个新分区的分区键要大于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_less_than_item指定的最后一个分区的分区键要等于正在被切割的分区的分区键大小。 不指定切割点的方式,partition_start_end_item指定的第一个新分区的起始点(如果存在的话)必须等于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_start_end_item指定的最后一个分区的终止点(如果存在的话)必须等于正在被切割的分区的分区键。 partition_less_than_item支持的分区键个数最多为4,而partition_start_end_item仅支持1个分区键,其支持的数据类型参见Partition Key。 在同一语句中partition_less_than_item和partition_start_end_item两者不可同时使用;不同split语句之间没有限制。 分区项partition_less_than_item的语法为: 1 2 PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } [, ...] ) 分区项partition_start_end_item的语法为,其约束参见START END语法描述。 1 2 3 4 5 6 PARTITION partition_name { {START(partition_value) END (partition_value) EVERY (interval_value)} | {START(partition_value) END ({partition_value | MAXVALUE})} | {START(partition_value)} | {END({partition_value | MAXVALUE})} } 列表分区的split_clause语法如下: 1 SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_values_clause | split_no_values_clause } 指定切割点的split_values_clause的语法为: 1 VALUES ( { (partition_value) [, ...] } | DEFAULT } ) INTO ( PARTITION partition_name , PARTITION partition_name ) 如果源分区不是DEFAULT分区,那么切割点所指定的边界是源分区边界的一个非空真子集;如果源分区是DEFAULT分区,那么切割点所指定的边界不能和其它非DEFAULT分区的边界存在重叠。 切割点的指定的边界是INTO关键字后面的第一个分区的边界,源分区边界与切割点的指定的边界的差集是第二个分区的边界。 当源分区是DEFAULT分区时,第二个分区的边界还是DEFAULT。 不指定切割点的split_no_values_clause的语法为: 1 INTO ( list_partition_item [, ....], PARTITION partition_name ) 此处的list_partition_item和创建列表分区表的时候指定分区的语法一样,除了此处的分区定义中边界值不能为DEFAULT。 除了最后一个分区,其他分区需要显式定义边界,定义的边界不能是DEFAULT,并且必须是源分区边界的非空真子集。最后一个分区的边界是源分区边界与其它分区边界的差集,且最后一个分区的边界为空(即差集不能为空集)。 如果源分区是DEFAULT分区,则最后一个分区的边界为DEFAULT。 add_clause子语法用于为指定的分区表添加一个或多个分区。 范围分区的add_clause语法如下: 1 ADD { partition_less_than_item... | partition_start_end_item } 使用partition_less_than_item语法时,分区表必须是范围分区表,否则执行会报错。 此处partition_less_than_item和创建范围分区表的时候指定分区的语法一样。 当前分区表的最后一个分区的边界为MAXVALUE,不允许添加新的分区,否则执行会报错。 列表分区的add_clause语法如下: 1 ADD list_partition_item 使用list_partition_item语法时,分区表必须是列表分区表,否则执行会报错 此处的list_partition_item和创建列表分区表的时候指定分区的语法一样 当前分区表存在DEFAULT分区时,不允许添加新的分区动作,否则执行会报错 drop_clause子语法用于删除分区表中的指定分区。 1 DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } drop_clause子语法支持删除多个分区语法。(8.1.3.100及以上集群版本支持。) 1 DROP PARTITION { partition_name [, ... ] } truncate_partitioned_clause子语法用于清理表分区的数据。 1 TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } ; 使用PARTITION FOR子句时,partition_value所在的整个分区会被清空。 修改表分区名字的语法。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} RENAME PARTITION { partition_name | FOR ( partition_value [, ...] ) } TO partition_new_name;
  • 注意事项 添加分区的名字不能与该分区表已有分区的名字相同。 对于范围分区表,要添加的分区的边界值要和分区表的分区键的类型一致,且要大于分区表的最后一个分区的上边界。 对于列表分区表,如果已经定义DEFAULT分区,则不能添加新分区。 若文档中未特殊注明,则表明范围分区表和列存分区的语法使用相同。 如果目标分区表中已有分区数达到了最大值(32767),则不能继续添加分区。 当分区表只有一个分区时,不能删除该分区。 删除分区(DROP PARTITION)时会连同分区内数据一起删除。 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。 Value分区表不支持相应的Alter Partition操作。 OBS冷热表对于move,exchange,merge,split操作,不支持指定分区表表空间为OBS表空间;执行ALTER语法时,需保持分区数据冷热属性不变(即冷分区操作后为冷分区,热分区操作后为热分区),不支持将冷分区数据切至本地表空间;对于冷分区仅支持默认表空间;merge操作不支持将冷分区与热分区进行合并,exchange操作不支持冷分区交换。 避免在业务高峰期执行ALTER TABLE/ALTER TABLE PARTITION(增删改查、DROP PARTITION)、TRUNCATE操作,避免有长SQL阻塞AlTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。 更多开发设计规范参见总体开发设计规范。
  • 表操作示例 重命名表: 1 ALTER TABLE CUSTOMER RENAME TO CUSTOMER_t; 给表增加一个新的约束: 1 ALTER TABLE customer_address ADD PRIMARY KEY(ca_address_sk); 根据已有唯一索引为表增加主键约束或唯一约束。 先给表CUSTOMER创建唯一索引CUSTOMER_constraint1,然后根据已有唯一索引增加主键约束,并对前面创建的索引rename: 1 2 CREATE UNIQUE INDEX CUSTOMER_constraint1 ON CUSTOMER(C_CUSTKEY); ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_constraint2 PRIMARY KEY USING INDEX CUSTOMER_constraint1; 重命名表约束: 1 ALTER TABLE CUSTOMER RENAME CONSTRAINT CUSTOMER_constraint2 TO CUSTOMER_constraint; 删除表约束: 1 ALTER TABLE CUSTOMER DROP CONSTRAINT CUSTOMER_constraint; 给表增加一个索引: 1 ALTER TABLE CUSTOMER ADD INDEX CUSTOMER_index(C_CUSTKEY); 删除表索引: 1 2 ALTER TABLE CUSTOMER DROP INDEX CUSTOMER_index; ALTER TABLE CUSTOMER DROP KEY CUSTOMER_index; 向在一个列存表中添加局部聚簇列: 1 ALTER TABLE customer_address ADD CONSTRAINT customer_address_cluster PARTIAL CLUSTER KEY(ca_address_sk); 删除一个列存表中的局部聚簇列: 1 ALTER TABLE customer_address DROP CONSTRAINT customer_address_cluster; 切换列存表的存储格式: 1 ALTER TABLE customer_address SET (COLVERSION = 1.0); 修改表的分布方式: 1 ALTER TABLE customer_address DISTRIBUTE BY REPLICATION; 修改表模式: 1 ALTER TABLE customer_address SET SCHEMA tpcds; 单表冷热切换: 1 ALTER TABLE cold_hot_table REFRESH STORAGE; 列存分区表修改为冷热表: 1 2 3 4 5 6 7 CREATE table test_1(id int,d_time date) WITH(ORIENTATION=COLUMN) DISTRIBUTE BY HASH (id) PARTITION BY RANGE (d_time) (PARTITION p1 START('2022-01-01') END('2022-01-31') EVERY(interval '1 day')) ALTER TABLE test_1 SET (storage_policy = 'LMT:100');
  • 参数说明 IF EXISTS 如果不存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表不存在。 table_name [*] | ONLY table_name | ONLY ( table_name ) table_name是需要修改的表名。 若声明了ONLY选项,则只有那个表被更改。若未声明ONLY,该表及其所有子表都将会被更改。另外,可以在表名称后面显示地增加*选项来指定包括子表,即表示所有后代表都被扫描,这是默认行为。 constraint_name 约束的名字。约束名长度不超过63个字符。 index_name 索引名称。 storage_parameter 表的存储参数的名字。 分区管理新增的两个选项: PERIOD(interval类型) 设置分区管理中自动创建分区的周期。 PERIOD的范围要求以及开启该功能的约束请参考▪PERIOD。 在建表时,如果没有设置该参数,可以通过set的方式添加该参数,并开启自动创建分区功能;如果之前已经设置该参数,则通过set的方式修改该参数。 用户可以通过reset该参数的方式关闭自动创建分区功能,但是在自动删除分区功能存在的情况下,不支持关闭自动创建分区功能。 TTL(interval类型) 设置分区管理中自动删除分区的分区过期时间。 TTL的范围要求以及开启该功能的约束请参考▪TTL。 在建表时,如果没有设置该参数,可以通过set的方式添加该参数,并开启自动删除分区功能;如果之前已经设置该参数,则通过set的方式修改该参数。 用户可以通过reset该参数的方式关闭自动删除分区功能。 new_owner 表所属新的拥有者的名字。 new_tablespace 表所属新的表空间名字。 column_name,column_1_name, column_2_name 现存的或新字段的名称。 data_type 新字段的类型,或者现存字段的新类型。 compress_mode 表字段的压缩可选项,当前仅对行存表有效。该子句指定该字段优先使用的压缩算法。 collation 字段排序规则名称。可选字段COLLATE指定了新字段的排序规则,如果省略,排序规则为新字段的默认类型。 USING expression USING子句声明如何从旧的字段值里计算新的字段值;如果省略,缺省从旧类型向新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换,则必须提供一个USING子句。 ALTER TYPE的USING选项实际上可以声明涉及该行旧值的任何表达式,即它可以引用除了正在被转换的字段之外其他的字段。这样,就可以用ALTER TYPE语法做非常普遍性的转换。因为这个灵活性,USING表达式并没有作用于该字段的缺省值(如果有的话),结果可能不是缺省表达式要求的常量表达式。这就意味着如果从旧类型到新类型没有隐含或者赋值转换的话,即使存在USING子句,ALTER TYPE也可能无法把缺省值转换成新的类型。在这种情况下,应该用DROP DEFAULT先删除缺省,执行ALTER TYPE,然后使用SET DEFAULT增加一个合适的新缺省值。类似的考虑也适用于涉及该字段的索引和约束。 NOT NULL | NULL 设置列是否允许空值。 integer 带符号的整数常值。当使用PERCENT时表示按照表数据的百分比收集统计信息,integer的取值范围为0-100。 attribute_option 属性选项。 PLAIN | EXTERNAL | EXTENDED | MAIN 字段存储模式。 PLAIN必须用于定长的数值(比如integer)并且是内联的、不压缩的。 MAIN用于内联、可压缩的数据。 EXTERNAL用于外部保存、不压缩的数据。使用EXTERNAL将令在text和bytea字段上的子字符串操作更快,但付出的代价是增加了存储空间。 EXTENDED用于外部的压缩数据,EXTENDED是大多数支持非PLAIN存储的数据的缺省。 CHECK ( expression ) 每次将要插入的新行或者将要被更新的行必须使表达式结果为真才能成功,否则会抛出一个异常并且不会修改数据库。 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 目前,CHECK表达式不能包含子查询也不能引用除当前行字段之外的变量。 DEFAULT default_expr 给字段指定缺省值。 缺省表达式的数据类型必须和字段类型匹配。 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 default_expr中若使用后缀操作符(如!),需使用括号括起来。 UNIQUE [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] index_parameters UNIQUE ( column_name [, ... ] ) [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] index_parameters UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。 其中[ NULLS [ NOT ] DISTINCT | NULLS IGNORE ]字段用来指定Unique唯一索引中索引列NULL值的处理方式。 默认取值:该参数默认取值为空,即NULL值可重复插入。 在对插入的新数据和表中原始数据进行列的等值比较时,对于NULL值有以下三种处理方式: NULLS DISTINCT:NULL值互不相等,即NULL值可重复插入。 NULLS NOT DISTINCT:NULL值相等。若索引列全为NULL,则NULL值不可重复插入;部分索引列为NULL,只有非NULL值不相等,才可成功插入数据。 NULLS IGNORE:在等值比较时跳过NULL值。若索引列全为NULL,则NULL值可重复插入;部分索引列为NULL,只有非NULL值不相等,才可成功插入数据。 三种处理方式具体的行为如下表所示: 表1 唯一索引中索引列NULL值的处理方式 字段控制 索引列全为NULL 部分索引列为NULL NULLS DISTINCT 可重复插入 可重复插入 NULLS NOT DISTINCT 不可重复插入 非NULL值相等,不可插入;非NULL值不相等,则插入成功 NULLS IGNORE 可重复插入 非NULL值相等,不可插入;非NULL值不相等,则插入成功 PRIMARY KEY index_parameters PRIMARY KEY ( column_name [, ... ] ) index_parameters 主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非NULL值。 DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE 设置该约束是否可推迟,列存暂不支持。 DEFERRABLE:可以推迟到事务结尾使用SET CONSTRAINTS命令检查。 NOT DEFERRABLE:在每条命令之后马上检查。 INITIALLY IMMEDIATE:那么每条语句之后就立即检查它。 INITIALLY DEFERRED:只有在事务结尾才检查它。 WITH ( {storage_parameter = value} [, ... ] ) 为表或索引指定一个可选的存储参数。 COMPRESS|NOCOMPRESS NOCOMPRESS:如果指定关键字NOCOMPRESS则不会修改表的现有压缩特性。 COMPRESS:如果指定COMPRESS关键字,则对该表进行批量插入元组时触发该特性。 new_table_name 修改后新的表名称。 new_column_name 表中指定列修改后新的列名称。 new_constraint_name 修改后表约束的新名称。 new_schema 修改后新的模式名称。 CASCADE 级联删除依赖于被依赖字段或者约束的对象(比如引用该字段的视图)。 RESTRICT 如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。这是缺省行为。 schema_name 表所在的模式名称。
  • 语法格式 修改表的定义。 1 2 ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } action [, ... ]; 其中具体表操作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 column_clause | ADD table_constraint [ NOT VALID ] | ADD table_constraint_using_index | VALIDATE CONSTRAINT constraint_name | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] | CLUSTER ON index_name | SET WITHOUT CLUSTER | SET ( {storage_parameter = value} [, ... ] ) | RESET ( storage_parameter [, ... ] ) | OWNER TO new_owner | SET TABLESPACE new_tablespace | SET {COMPRESS|NOCOMPRESS} | DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } } | TO { GROUP groupname | NODE ( nodename [, ... ] ) } | ADD NODE ( nodename [, ... ] ) | DELETE NODE ( nodename [, ... ] ) | DISABLE TRIGGER [ trigger_name | ALL | USER ] | ENABLE TRIGGER [ trigger_name | ALL | USER ] | ENABLE REPLICA TRIGGER trigger_name | ENABLE ALWAYS TRIGGER trigger_name | DISABLE ROW LEVEL SECURITY | ENABLE ROW LEVEL SECURITY | FORCE ROW LEVEL SECURITY | NO FORCE ROW LEVEL SECURITY | REFRESH STORAGE ADD table_constraint [ NOT VALID ] 给表增加一个新的约束。 ADD table_constraint_using_index 根据已有唯一索引为表增加主键约束或唯一约束。 VALIDATE CONSTRAINT constraint_name 验证一个外键或是一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] 删除一个表上的约束。 CLUSTER ON index_name 为将来的CLUSTER操作选择默认索引。实际上并没有重新盘簇化处理该表。 SET WITHOUT CLUSTER 从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的集群操作。 SET ( {storage_parameter = value} [, ... ] ) 修改表的一个或多个存储参数。 RESET ( storage_parameter [, ... ] ) 重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重写表才能获得想要的效果。 OWNER TO new_owner 将表、序列、视图的属主改变成指定的用户。 SET {COMPRESS|NOCOMPRESS} 修改表的压缩特性。表压缩特性的改变只会影响后续批量插入的数据的存储方式,对已有数据的存储毫无影响。也就是说,表压缩特性的修改会导致该表中同时存在着已压缩和未压缩的数据。 DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } } 修改表的分布方式,在修改表分布信息的同时会将表数据在物理上按新分布方式重新分布,修改完成后建议对被修改表执行ANALYZE,以便收集全新的统计信息。 本操作属于重大变更操作,涉及表分布信息的修改以及数据的物理重分布,修改过程中会阻塞业务,修改完成后原有业务的执行计划会发生变化,请按照正规变更流程进行。 本操作属于资源密集操作,针对大表的分布方式修改,建议在计算和存储资源充裕情况下进行,保证整个集群和原表所在表空间有足够的剩余空间能存储一张与原表同等大小且按照新分布方式进行分布的表。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } 此语法仅在扩展模式(GUC参数enable_cluster_resize为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。 ADD NODE ( nodename [, ... ] ) 此语法主要供内部扩容工具使用,一般用户不建议使用。 DELETE NODE ( nodename [, ... ] ) 此语法主要供内部缩容工具使用,一般用户不建议使用。 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 ROW LEVEL SECURITY 开启或关闭表的行访问控制开关。 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见CREATE ROW LEVEL SECURITY POLICY章节。 NO FORCE/FORCE ROW LEVEL SECURITY 强制开启或关闭表的行访问控制开关。 默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)会受影响。系统管理员可以绕过所有的行访问控制策略,不受影响。 REFRESH STORAGE 根据OBS冷热表storage_policy所定义的规则,将符合条件的本地热分区切换为存储在OBS上的冷分区。 例如创建OBS冷热表时,设置storage_policy 为 'LMT:10',则在执行该操作时可将10日前无修改的分区切为冷存储,存至OBS中。 其中列相关的操作column_clause可以是以下子句之一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | MODIFY [ COLUMN ] column_name data_type | MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NULL | MODIFY [ COLUMN ] column_name DEFAULT default_expr | MODIFY [ COLUMN ] column_name ON UPDATE on_update_expr | MODIFY [ COLUMN ] column_name COMMENT comment_text | 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 [, ...] )) | ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] LOCAL [ ( { PARTITION index_partition_name } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] | ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ WHERE predicate ] | DROP { INDEX | KEY } index_name | CHANGE [ COLUMN ] old_column_name new_column_name data_type [ [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | [ CONSTRAINT constraint_name ] NULL | DEFAULT default_expr | COMMENT 'text' ] | 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 ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] 向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。 ADD ( { column_name data_type [ compress_mode ] } [, ...] ) 向表中增加多列。 MODIFY [ COLUMN ] column_name data_type 修改表已存在字段的数据类型。需注意:不支持修改分布列数据类型。 MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] 为表的某列添加not null约束,列存表暂不支持。 MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NULL 为表的某列移除not null约束。 MODIFY [ COLUMN ] column_name DEFAULT default_expr 修改表的default值。 MODIFY [ COLUMN ] column_name ON UPDATE on_update_expr 修改表中指定列的on update表达式,该列必须为timestamp类型或者timestamptz类型,当on_update_expr为NULL值时,则为删除ON UPDATE子句。 MODIFY [ COLUMN ] column_name COMMENT comment_text 修改表的注释信息。 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 ] 改变表字段的数据类型,只允许相同大类的类型转换(数值之间,字符串之间,时间之间等)。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 ALTER TYPE要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是 1 ALTER TABLE table ALTER COLUMN anycol TYPE anytype; 这里的anycol是任何在表中还存在的字段,而anytype是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强制重写,这样就删除了不再使用的数据。 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 { INDEX | UNIQUE [ INDEX ] } [ index_name ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] LOCAL [ ( { PARTITION index_partition_name } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] 为表的分区表创建索引,具体参数可参考CREATE INDEX。 ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ WHERE predicate ] 在表上创建索引,具体参数可参考CREATE INDEX。 DROP { INDEX | KEY } index_name 删除一个表上的索引。 CHANGE [ COLUMN ] old_column_name new_column_name data_type [ [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | [ CONSTRAINT constraint_name ] NULL | DEFAULT default_expr | COMMENT 'text' ] 修改表中列信息,可将旧列名修改成新列名,以及修改列字段信息。 {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和cstore_cu_sample_ratio。n_distinct 设置并固定表的distinct值统计信息,n_distinct_inherited 设置并固定继承表的distinct值统计信息,cstore_cu_sample_ratio 设置对cstore列存表进行analyze时所选CU的比例。目前,禁止SET/RESET n_distinct_inherited参数。 n_distinct 手动设置该列的distinct值统计信息。 取值范围:-1.0 ~ INT_MAX 默认值:0,表示不设置。 n_distinct_inherited 手动设置继承表的该列的distinct值统计信息。 取值范围:-1.0 ~ INT_MAX 默认值:0,表示不设置。 cstore_cu_sample_ratio 设置列存表执行analyze,计算需要采样的CU个数时,需要扩大的倍数。 取值范围:1.0 ~ 10000.0 默认值:1.0 ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 其中列约束column_constraint为: 1 2 3 4 5 6 7 8 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | UNIQUE [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] index_parameters | PRIMARY KEY index_parameters } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中列的压缩可选项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 [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中索引参数index_parameters为: 1 2 [ WITH ( {storage_parameter = value} [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ]
  • 注意事项 只有表的所有者或者被授予了表ALTER权限的用户有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。但要修改表的所有者或者修改表的模式,当前用户必须是该表的所有者或者系统管理员,且该用户是新的所有角色的直接或间接成员。 不支持修改存储参数ORIENTATION。 SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。 列存表支持PARTIAL CLUSTER KEY,不支持外键表级约束。列存表自8.1.1集群版本开始支持主键和唯一表级约束。 行存REPLICATION分布表不支持将系统列设置为主键。 列存表支持添加字段ADD COLUMN,修改字段的数据类型ALTER TYPE,设置单个字段的收集目标SET STATISTICS,支持更改表名字,支持删除字段DROP COLUMN;对于添加的字段和修改的字段类型要求是列存支持的数据类型;ALTER TYPE的USING选项只支持常量表达式和涉及本字段的表达式,暂不支持涉及其他字段的表达式。 列存表支持的字段约束包括NULL、NOT NULL和DEFAULT常量值;对字段约束的修改,当前支持对DEFAULT值的修改(SET DEFAULT)、删除(DROP DEFAULT)和NOT NULL约束的删除; 支持对列存表添加非空约束NOT NULL以及主键约束。该约束仅8.2.0及以上集群版本支持。 修改列存表存储参数COLVERSION或者enable_delta时,不能与其他ALTER操作同时进行。
  • 示例 查询会话信息: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT sid,serial#,username FROM V$SESSION; sid | serial# | username -----------------+---------+---------- 140131075880720 | 0 | 140131025549072 | 0 | 140131073779472 | 0 | 140131071678224 | 0 | 140131125774096 | 0 | 140131127875344 | 0 | 140131113629456 | 0 | 140131094742800 | 0 | (8 rows) 结束SID为140131075880720的会话: 1 ALTER SYSTEM KILL SESSION '140131075880720,0' IMMEDIATE;
  • 示例 创建模式ds: 1 CREATE SCHEMA ds; 设置模式搜索路径: 1 SET SEARCH_PATH TO ds, public; 设置日期时间风格为传统的POSTGRES风格(日在月前): 1 SET DATESTYLE TO postgres, dmy; 设置当前会话的字符编码为UTF8: 1 ALTER SESSION SET NAMES 'UTF8'; 设置时区为加州伯克利: 1 SET TIME ZONE 'PST8PDT'; 设置时区为意大利: 1 SET TIME ZONE 'Europe/Rome'; 设置当前模式: 1 ALTER SESSION SET CURRENT_SCHEMA TO tpcds; 设置XML OPTION为DOCUMENT: 1 ALTER SESSION SET XML OPTION DOCUMENT; 创建角色joe,并设置会话的角色为joe: 1 2 CREATE ROLE joe WITH PASSWORD '{password}'; ALTER SESSION SET SESSION AUTHORIZATION joe PASSWORD '{password}'; 切换到默认用户: 1 ALTER SESSION SET SESSION AUTHORIZATION default;
  • 参数说明 SESSION 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 value config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 例如:set schema 'public'; NAMES encoding_name 用于设置客户端的字符编码。等价于set client_encoding to encoding_name。 取值范围:有效的字符编码。该选项对应的运行时参数名称为client_encoding,默认编码为UTF8。 XML OPTION option 用于设置XML的解析方式。 取值范围:CONTENT(缺省),DOCUMENT。
  • 语法格式 设置会话的事务参数。 1 2 ALTER SESSION SET [ SESSION CHARACTERISTICS AS ] TRANSACTION { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED } | { READ ONLY | READ WRITE } } [, ...] ; 设置会话的其他运行时参数。 1 2 3 4 5 6 7 8 9 10 ALTER SESSION SET {{config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }} | CURRENT_SCHEMA [ TO | = ] { schema | DEFAULT } | TIME ZONE time_zone | SCHEMA schema | NAMES encoding_name | ROLE role_name PASSWORD 'password' | SESSION AUTHORIZATION { role_name PASSWORD 'password' | DEFAULT } | XML OPTION { DOCUMENT | CONTENT } } ;
  • 示例 修改现有名为hdfs_server的address: 1 ALTER SERVER hdfs_server OPTIONS ( SET address '10.10.0.110:25000,10.10.0.120:25000'); 修改现有名为hdfs_server的hdfscfgpath: 1 ALTER SERVER hdfs_server OPTIONS ( SET hdfscfgpath '/opt/bigdata/hadoop');
  • 语法格式 修改外部服务的参数。 1 2 ALTER SERVER server_name [ VERSION 'new_version' ] [ OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ] ) ]; 在OPTIONS选项里,ADD、SET和DROP指定要执行的操作,未指定时默认为ADD操作。option和value为对应操作的参数。 对于HDFS Server目前只支持SET操作,ADD/DROP操作现有版本不支持。语法中SET和DROP操作语法依然保留,以便后续扩展使用。 修改外部服务的所有者。 1 2 ALTER SERVER server_name OWNER TO new_owner; 修改外部服务的名字。 1 2 ALTER SERVER server_name RENAME TO new_name; 刷新HDFS配置文件。仅8.0.0.10及以上版本支持(8.1.0除外)。 1 ALTER SERVER server_name REFRESH OPTIONS;
  • 参数说明 server_name 所修改的server的名字。 new_version 修改后server的新版本名称。 修改server所支持的OPTIONS如下所示: address OBS服务的终端节点(Endpoint)。 HDFS集群的主备节点所在的IP地址以及端口。 对于HDFS server,address必须存在,所以ADD和DROP操作不被允许。 address目前只支持点分十进制格式的ipv4格式,且address字符串中不能出现空格,多组address以逗号作为分隔符。ip和port之间使用“:”来区分。HDFS集群中ip、port组对推荐设置两组,分别对应HDFS NameNode主备节点的address。 当server类型为 DLI 时,address为DLI服务上数据所存储的OBS address。 hdfscfgpath HDFS集群的配置文件。 若HDFS走安全模式时,hdfscfgpath是必选项,否则为可选项。 若设置hdfscfgpath时,path仅能设置一个。 fed 表示dfs_fdw连接的是HDFS为联邦模式。 取值rbf,表示HDFS为联邦rbf方式。 该参数8.1.2及以上版本支持;8.0.0基线版本下,仅8.0.0.10及以上版本支持。 encrypt 是否对数据进行加密,该参数仅支持在type为OBS时设置。默认值为off。 取值范围: on表示对数据进行加密。 off表示不对数据进行加密。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取),创建外表时AK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 dli_address DLI服务的终端节点,即endpoint。该参数仅支持type为DLI时设置。 dli_access_key DLI访问协议对应的AK值(DLI云服务界面由用户获取),创建外表时AK值会保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 dli_secret_access_key DLI访问协议对应的SK值(DLI云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 region 此参数表示OBS服务的IP地址或者 域名 信息。该参数仅支持type为OBS时设置。 dbname 用于协同分析、跨集群互联互通,表示将要连接的远端集群的数据库名字。 username 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名。 password 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名密码。 syncsrv 仅用于跨集群互联互通,表示数据同步过程中使用到的GDS服务,设置方式与GDS外表的location属性相同。该参数仅8.1.2及以上版本支持。 new_owner 修改后server的新拥有者。更改所有者,必须是外部服务器的所有者并且也是新的所有者角色的直接或者间接成员,并且必须对外部服务器的外部数据封装器有USAGE权限。 new_name 修改后server的新名字。 REFRESH OPTIONS 刷新HDFS的配置文件信息,在配置文件有变动时执行,若不执行可能会访问报错。
  • 语法格式 修改序列最大值或归属列 1 2 3 4 ALTER SEQUENCE [ IF EXISTS ] name [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE ] [ CACHE cachevalue ] [ OWNED BY { table_name.column_name | NONE } ] ; 修改序列的拥有者 1 ALTER SEQUENCE [ IF EXISTS ] name OWNER TO new_owner;
  • 参数说明 name 将要修改的序列名称。 IF EXISTS 当序列不存在时使用该选项不会出现错误消息,仅有一个通知。 MAXVALUE maxvalue | NO MAXVALUE 序列所能达到的最大值。如果声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE。 CACHE cachevalue 该参数仅8.2.1.100及以上集群版本支持。 指定要预先分配多少序列号并存储在内存中以便更快地访问。cachevalue最小值为 1(一次只能生成一个值,即 NOCACHE)。如果未指定,则保留旧缓存值。 OWNED BY 将序列和一个表的指定字段进行关联。这样,在删除指定字段或其所在表的时候会自动删除已关联的序列。 如果序列已经和表有关联后,使用OWNED BY参数后新的关联关系会覆盖旧的关联。 关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。 使用OWNED BY NONE将删除任何已经存在的关联。 new_owner 序列新所有者的用户名。用户要修改序列的所有者,必须是新角色的直接或者间接成员,并且所有者角色必须有序列所在模式上的CREATE权限。
共100000条