PostgreSQL 动态表复制(CREATE TABLE ASCREATE TABLE LIKE)(3)

结论是我们的LIKE选项为:INCLUDING INDEXES INCLUDING COMMENTS,所以这次就能复制一个“最贴近我们需求”的表了:

create table t_key_event_file_student_103 (like t_key_event_file_student INCLUDING INDEXES INCLUDING COMMENTS);

依旧看一下DDL语句:

这里写图片描述

如上图,可以看到这次复制的有NOT-NULL约束、主键约束以及注释,这样就完成了我们的表复制,可刚才为什么说创建的是最贴近我们需求的表呢?因为到此为止对比需求发现我们可能还少了点东西,原始表中有外键约束,那么该如何复制呢?答案是无法复制,PostgreSQL官方并不提供外键约束的复制,所以只能自己通过alter语句去添加外键约束了,同样序列也是,通过语句手动创建即可,最后就看一下通过PostgreSQL的自定义函数完成动态表复制的全过程。

自定义函数实现动态复制

如题,需求是传入一个字符串数组,根据数组的大小(n)来动态复制n张表,接下来直接看一下完整的自定义函数代码:

CREATE OR REPLACE FUNCTION "public"."f_inittables1"(arr _text) RETURNS "pg_catalog"."void" AS $BODY$ DECLARE scount INTEGER; rownum integer := 1; currsnum text; strSQL text; BEGIN scount:=array_length(arr,1); while rownum <= scount LOOP currsnum:=arr[rownum]; RAISE NOTICE '这里是%', currsnum; -- 开始复制 ----建表 strSQL := 'CREATE TABLE t_self_evaluation'||'_'||currsnum||' (like t_self_evaluation including constraints including indexes including comments);'; EXECUTE strSQL; ----添加外键约束 strSQL :='alter table t_self_evaluation'||'_'||currsnum||' add constraint FK_T_SELF_E_REF12_T_EVALUA_'||currsnum||' foreign key (scheme_id) references t_evaluation_scheme (id) on delete restrict on update restrict;'; EXECUTE strSQL; ----指定序列 strSQL :='create sequence t_self_evaluation_'||currsnum||'_id_seq increment by 1 minvalue 1 maxvalue 9223372036854775807 start with 1 owned by t_self_evaluation_'||currsnum||'.id'; EXECUTE strSQL; rownum := rownum + 1; end LOOP; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100 ; ALTER FUNCTION "public"."f_inittables1"(arr _text) OWNER TO "postgres";

如上所示,遍历参数数组,根据数组的值拼接构造表名,同时构造外键名和序列名,在循环的n次中通过EXECUTE关键字执行建表语句实现动态建表,下面调用一下试试,传入一个5个字符串的数组:

select f_inittables1('{"021","270","271","070","150"}');

运行结束后可以看到控制台成功打印了RAISE NOTICE信息:

这里写图片描述

最后再看一下复制的表:

这里写图片描述


这里写图片描述



这里写图片描述

如上图,可以看到已经完全满足我们的需求了,至此我们的动态表复制就算全部结束了。

总结

简单记录一下PostgreSQL中实现动态表复制的全过程,希望对遇到同样问题的朋友有所帮助,The End。

------------------------------------华丽丽的分割线------------------------------------

CentOS 6.5上编译安装PostgreSQL 9.3数据库

CentOS 6.3环境下yum安装PostgreSQL 9.3

PostgreSQL缓存详述

Windows平台编译 PostgreSQL

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f9706631385d2e4e4139a57f02e0d2ef.html