暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

MogDB/PostgreSQL数据库SQL命令之ALTER TABLE

1129

对于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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论