对于MogDB 2.1.0/PostgreSQL13.4数据库的ALTER TABLE命令可以实现哪些功能做了测试和整理。
首先创建测试表:
PostgreSQL13.4数据库:
create user test password 'test@123';
create tablespace tbs_01 LOCATION '/XX/XXX/tbs_01';
create table test (id int);
CREATE TABLE test1(id int, a int, c serial, sum_score int GENERATED ALWAYS AS (a+id) STORED );
CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
NEW.created_date=now();
RETURN NEW;
END
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER insert_trigger
BEFORE INSERT ON test
FOR EACH ROW
EXECUTE PROCEDURE tri_insert_func();
CREATE RULE notify_me AS ON UPDATE TO test DO ALSO NOTIFY test;
create table test2 (a int primary key, b varchar(10));
CREATE TYPE employee_type AS (name text, salary numeric);
create table test3 (name text,salary numeric);
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2008m02
(LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS)
TABLESPACE tbs_01;
ALTER TABLE measurement_y2008m02 ADD CONSTRAINT y2008m02
CHECK ( logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' );
MogDB 2.1.0数据库:
create user test password 'test@123';
create tablespace tbs_01 LOCATION '/XX/XXX/tbs_01';
create table test (id int);
CREATE TABLE test1(id int, a int, c serial, sum_score int GENERATED ALWAYS AS (a+id) STORED );
CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
$$
DECLARE
BEGIN
NEW.created_date=now();
RETURN NEW;
END
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER insert_trigger
BEFORE INSERT ON test
FOR EACH ROW
EXECUTE PROCEDURE tri_insert_func();
CREATE RULE "_RETURN" AS
ON SELECT TO test
DO INSTEAD
SELECT * FROM test where id =2;
create table test2 (a int primary key, b varchar(10));
CREATE TYPE employee_type AS (name text, salary numeric);
create table test3 (name text,salary numeric);
CREATE TABLE startend_pt (c1 INT, c2 INT)
PARTITION BY RANGE (c2) (
PARTITION p1 START(1) END(1000) EVERY(200) TABLESPACE tbs_01,
PARTITION p2 END(2000),
PARTITION p3 START(2000) END(2500),
PARTITION p4 START(2500),
PARTITION p5 START(3000) END(5000) EVERY(1000))
ENABLE ROW MOVEMENT;
CREATE TABLE test5 (c1 INT, c2 INT);
insert into test5 values(1,1015);
CREATE INDEX idx_startend_pt_c2 ON startend_pt(c2) LOCAL;
ALTER TABLE 功能比对结果如下:
| 修改表定义 | PostgreSQL数据库 | MogDB数据库 |
|---|---|---|
| 增加列 | 增加单列:alter table test add column name varchar(20); 增加多列:alter table test add a_date timestamp, add created_date timestamp; | 不支持增加自增列,或者增加DEFAULT值中包含nextval()表达式的列。增加单列:alter table test add column name varchar(20); 增加多列:alter table test add a_date timestamp, add created_date timestamp; |
| 删除列 | 可以删除一个表的唯一的列,从而留下一个零列的表。alter table test drop column name; | 不可以删除一个表的唯一的列。alter table test drop column name; |
| 修改表中一列的类型 | 修改单列:alter table test alter column id type varchar(10); 修改多列: alter table test alter column a_date type date,alter column created_date type date; 转换类型的时候有隐含类型转换的时候,会自动转换,如果没有,那么就必须使用using指定一下转换规则。alter table test alter column id set data type int using id::integer; | 修改单列:alter table test alter column id type varchar(10); alter table test alter column id type int;alter table test modify a_date date;修改多列:alter table test modify a_date date,modify created_date date;alter table test alter column a_date type date,alter column created_date type date; |
| 设置/删除列的默认值 | 设置列的默认值:默认值不会自动填充已有行数据。alter table test alter column id set default 0; 删除列的默认值:alter table test alter column id drop default; | 设置列的默认值:默认值不会自动填充已有行数据。alter table test alter column id set default 0; 删除列的默认值:alter table test alter column id drop default; |
| 设置列是否允许空值 | 设置列不允许空值:alter table test alter column id set not null; 设置列允许空值:alter table test alter column id drop not null; | 设置列不允许空值:alter table test alter column id set not null; 设置列允许空值:alter table test alter column id drop not null; |
| 将存储的生成列转换为普通的基本列。 | ALTER TABLE test1 ALTER COLUMN sum_score DROP EXPRESSION ;不支持普通列转换为生成列。 | / |
| 设置/修改/删除标识列 | 设置标识列(修改普通列为标识列要求此列已存在非空约束):delete from test1; ALTER TABLE test1 ALTER COLUMN sum_score set not null; ALTER TABLE test1 ALTER COLUMN sum_score add GENERATED by default as identity; 修改标识列:ALTER TABLE test1 ALTER COLUMN sum_score set GENERATED always set increment by 2 ; 删除标识列ALTER TABLE test1 ALTER COLUMN sum_score drop identity; | / |
| 修改列的统计收集目标 | ALTER TABLE test1 ALTER COLUMN id set statistics 1000; | ALTER TABLE test1 ALTER COLUMN id set statistics 1000; |
| 设置或者重置列的属性选项。 | 设置列属性:ALTER TABLE test1 ALTER COLUMN id set (n_distinct=10); 重置列属性:ALTER TABLE test1 ALTER COLUMN id reset (n_distinct); | 设置列属性:ALTER TABLE test1 ALTER COLUMN id set (n_distinct=10); 重置列属性:ALTER TABLE test1 ALTER COLUMN id reset (n_distinct); |
| 设置列的存储模式 | ALTER TABLE test1 ALTER COLUMN sum_score set storage plain; | ALTER TABLE test1 ALTER COLUMN sum_score set storage plain; |
| 为表添加/删除约束 | 添加约束:ALTER TABLE test1 ADD CHECK (a>6) not valid; ALTER TABLE test1 ADD CONSTRAINT chk_a CHECK (a>6) not valid; 删除约束: ALTER TABLE test1 drop CONSTRAINT chk_a ; | 添加约束:ALTER TABLE test1 ADD CHECK (a>6) not valid; ALTER TABLE test1 ADD CONSTRAINT chk_a CHECK (a>6) not valid; 删除约束: ALTER TABLE test1 drop CONSTRAINT chk_a ; |
| 根据已有唯一索引为表增加主键约束或唯一约束。 | delete from test1; create unique index idx_test1_id on test1(id); alter table test1 add primary key using index idx_test1_id; | delete from test1; create unique index idx_test1_id on test1(id); alter table test1 add primary key using index idx_test1_id; |
| 创建外键约束 | alter table test add foreign key (id) references test1(id); | alter table test add foreign key (id) references test1(id); |
| 修改外键约束 | alter table test alter constraint test_id_fkey INITIALLY DEFERRED; | / |
| 验证之前创建为NOT VALID的外键或检查约束 | alter table test1 validate constraint test1_a_check; | alter table test1 validate constraint test1_a_check; |
| 禁用/启用触发器 | 禁用触发器:alter table test disable trigger insert_trigger; 启用触发器:alter table test enable trigger insert_trigger; | 禁用触发器:alter table test disable trigger insert_trigger; 启用触发器:alter table test enable trigger insert_trigger; |
| 禁用/启用规则 | 禁用规则:alter table test disable rule notify_me; 启用规则:alter table test enable rule notify_me; | 禁用规则:alter table test disable rule “_RETURN”; 启用规则:alter table test enable rule “_RETURN”; |
| 禁用/启用表的行级安全性 | 启用表的行级安全性:alter table test enable row level security; 禁用表的行级安全性:alter table test disable row level security; | 启用表的行级安全性:alter table test enable row level security; 禁用表的行级安全性:alter table test disable row level security; |
| 设置/取消表的拥有者受行级安全性策略控制 | 设置表的拥有者受行级安全性策略控制:alter table test force row level security; 取消表的拥有者受行级安全性策略控制: alter table test no force row level security; | 设置表的拥有者受行级安全性策略控制:alter table test force row level security; 取消表的拥有者受行级安全性策略控制: alter table test no force row level security; |
| 为未来的CLUSTER操作选择默认的索引 | alter table test1 cluster on idx_test1_id; | alter table test1 cluster on idx_test1_id; |
| 从表中移除最近使用的 CLUSTER索引说明。 | alter table test1 set without cluster; | alter table test1 set without cluster; |
| 添加/删除oid系统列 | 删除oid系统列:alter table test set without oids;由于oid系统列无法再添加,此语法作用仅是向后兼容。 | / |
| 更改表的存储表空间 | alter table test set tablespace tbs_01; | alter table test set tablespace tbs_01; |
| 设置表是否记录日志 | 设置表不记录日志:alter table test set unlogged; 设置表记录日志:alter table test set logged; | / |
| 修改/重置表的存储参数 | 修改表的填充因子:alter table test set(fillfactor=40);重置表的填充因子:alter table test reset(fillfactor); | 修改表的填充因子:alter table test set(fillfactor=40);重置表的填充因子:alter table test reset(fillfactor); |
| 继承/取消继承 | 向表中添加与父表相同的列:要被增加为一个子女,目标表必须已经包含和父表完全相同的列(也可以有额外的列)。这些列必须具有匹配的数据类型,并且如果它们在父表中具有NOT NULL约束,它们在子表中也必须有NOT NULL约束。alter table test add column a int default 0 constraint test_a_nll not null;alter table test add column b varchar(10); 指定父表: alter table test inherit test2;从指定父表的子女列表中移除:alter table test no inherit test2; | 向表中添加与父表相同的列:要被增加为一个子女,目标表必须已经包含和父表完全相同的列(也可以有额外的列)。这些列必须具有匹配的数据类型,并且如果它们在父表中具有NOT NULL约束,它们在子表中也必须有NOT NULL约束。alter table test add column a int default 0 constraint test_a_nll not null;alter table test add column b varchar(10); 指定父表: alter table test inherit test2;从指定父表的子女列表中移除:alter table test no inherit test2; |
| 类型化表/取消类型化 | 类型化表:表的列名和类型列表必须精确地匹配该组合类型。 该表必须不从任何其他表继承。alter table test3 of employee_type; 取消类型化: alter table test3 not of ; | 类型化表:表的列名和类型列表必须精确地匹配该组合类型。 该表必须不从任何其他表继承。alter table test3 of employee_type; 取消类型化: alter table test3 not of ; |
| 修改表的拥有者 | 修改表的拥有者,表中列拥有的索引和序列的拥有者也会随之变化。alter table test owner to test; | 修改表的拥有者,表中列拥有的索引和序列的拥有者也会随之变化。alter table test1 owner to test; |
| 修改表上的复制标识 | alter table test replica identity full; | alter table test replica identity full; |
| 修改表名 | alter table test rename to test_t; | alter table test1 rename to test_t; |
| 修改表上约束名称 | alter table test_t rename constraint test_id_fkey to test_t_id_fkey; | alter table test rename constraint test_id_fkey to test_t_id_fkey; |
| 修改表中列名 | alter table test_t rename column a_date to b_date; | alter table test_t rename column a to b; |
| 修改表的所属模式 | 把表移动到另一个模式中。表中列拥有的索引、约束和序列也会被移动。alter table test_t set schema test; | 不支持修改为系统内部模式。把表移动到另一个模式中。表中列拥有的索引和序列也会被移动。alter table test_t set schema test; |
| 挂接/分离分区 | 挂接分区:ALTER TABLE measurement ATTACH PARTITION measurement_y2008m02 FOR VALUES FROM (‘2008-02-01’) TO (‘2008-03-01’ );分离分区:ALTER TABLE measurement DETACH PARTITION measurement_y2008m02; | / |
| 增加/删除分区 | / | 增加分区:ALTER TABLE startend_pt ADD PARTITION p6 START(5000) END(6000) EVERY(300) TABLESPACE tbs_01;删除分区:ALTER TABLE startend_pt DROP PARTITION p6_1; |
| 分割分区 | / | ALTER TABLE startend_pt SPLIT PARTITION FOR(4500) INTO(PARTITION q1 START(4000) END(5000) EVERY(250) TABLESPACE tbs_01); |
| 合并分区 | / | ALTER TABLE startend_pt MERGE PARTITIONS P6_2, P6_3 INTO PARTITION P6; |
| 清空分区 | / | ALTER TABLE startend_pt truncate PARTITION p2 ; |
| 修改分区属性 | / | 禁用表的行迁移:ALTER TABLE startend_pt disable row MOVEMENT; 开启表的行迁移:ALTER TABLE startend_pt enable row MOVEMENT; |
| 把普通表的数据迁移到指定的分区 | / | ALTER TABLE startend_pt exchange partition (p2) with table test5; |
| 移动分区到新的表空间 | / | ALTER TABLE startend_pt MOVE PARTITION p2 TABLESPACE tbs_01; |
| 设置分区的本地索引是否可用 | / | 设置分区的本地索引不可用:alter table startend_pt modify partition p2 UNUSABLE LOCAL INDEXES ; 重建分区的本地索引:alter table startend_pt modify partition p2 REBUILD UNUSABLE LOCAL INDEXES ; |
| 分割二级分区 | / | |
| 清空二级分区 | / |
最后修改时间:2022-01-25 20:37:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




