更新时间:2024-10-09 GMT+08:00

ALTER TABLE

功能描述

修改表,包括修改表的定义、重命名表、重命名表中指定的列、添加/更新多个列、将列存改为HStore表等。

注意事项

  • 通过ALTER修改enable_hstore值可以将列存表变成HStore表,或者将HStore修改成列存表。但需要注意enable_delta为on时,无法设置enable_hstore为on。
  • 对于部分ALTER操作(修改列类型,分区合并,添加NOT NULL约束,添加主键约束),HStore表需要先将数据MERGE到主表然后再执行原有的ALTER逻辑,这可能会带来额外的性能开销, 性能影响大小与delta表的数据量相关。
  • 当需要增加列时, 建议不要与其它类型的ALTER(比如修改列类型等)组合使用,在一条ALTER里只有ADD COLUMN情况下,由于不需要做FULL MERGE,性能会有很大提升。
  • 不支持修改存储参数ORIENTATION。

修改表属性

使用语法:

1
ALTER TABLE [ IF EXISTS ] <table_name> SET  ( {ENABLE_HSTORE = ON} [, ... ] );

将列存表修改成HStore表:

1
2
CREATE TABLE alter_test(a int, b int) WITH(ORIENTATION = COLUMN);
ALTER TABLE alter_test SET (ENABLE_HSTORE = ON);

当需要使用HStore表时,一定要同步修改如下参数的默认值,否则会导致HStore性能严重劣化,推荐的默认配置是

autovacuum_max_workers_hstore=3,autovacuum_max_workers=6,autovacuum=true。

增加列

使用语法:

1
ALTER TABLE [ IF EXISTS ] <table_name> ADD COLUMN <new_column> <data_type> [ DEFAULT <default_value>];

示例:

创建表alter_test2并对其增加列:

1
2
CREATE TABLE alter_test2(a int, b int) WITH(ORIENTATION = COLUMN,ENABLE_HSTORE = ON);
ALTER TABLE alter_test ADD COLUMN c int;

增加列时不建议在同一个SQL中与其它ALTER组合使用。

重命名

使用语法:

1
ALTER TABLE [ IF EXISTS ] <table_name> RENAME TO <new_table_name>;

示例:

创建表alter_test3并对其重命名为alter_new:

1
2
CREATE TABLE alter_test3(a int, b int) WITH(ORIENTATION = COLUMN,ENABLE_HSTORE = ON);
ALTER TABLE alter_test3 RENAME TO alter_new;