postgresql 分表规则实时修改

前端之家收集整理的这篇文章主要介绍了postgresql 分表规则实时修改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. postgresql数据库支持数据库分表,但是有时会遇到,现场的数据库已经在跑了,但是新的需求,需要增加一个字段,
  1. 字段增加,分表会自动增加的,但是规则不会实时更新,规则不更新的话,分表新的字段的值就不会更新掉。
  1. 其实只需要把所有的规则修改下就可以了,但是有时规则比较多,手动修改还是有点麻烦,所以,就写了一个函数
  1. 做这个功能,这个使用起来还是很快很方便的,这里使用到的就是游标、函数
  1. -------------该函数只需要主表名称和时间字段,即可针对主表字段有增加修改删除的情况时,一键修改规则------------------------------
  2. ----------------------------定制项目有时会遇到有分表需要增加字段的情况,但是现场不会重新安装,但是----------------------------------------------------------------
  3. create
  4. or replace function cursor_demo (
  5. tabname character varying,timefield character varying
  6. ) returns refcursor as $body$ declare
  7. sub_tab_name varchar (1000) ; column_name_desc varchar (1000) ; declare
  8. fetch_sub_tab_refcursor cursor for select
  9. tablename
  10. from
  11. pg_tables
  12. where
  13. tablename like tabname || '_%' ; declare
  14. fetch_sub_column_refcursor cursor for select
  15. column_name
  16. from
  17. information_schema. columns
  18. where
  19. table_name = tabname ; declare
  20. sql_desc varchar (1000) ; declare
  21. value_desc varchar (1000) ; declare
  22. all_sql_desc varchar (2000) ; declare
  23. st_time varchar (100) ;
  24. begin
  25. open fetch_sub_tab_refcursor ; loop fetch fetch_sub_tab_refcursor into sub_tab_name ;
  26. if found then
  27.  
  28. if (
  29. length (tabname) = (length(sub_tab_name) - 7)
  30. ) then
  31.  
  32. if (
  33. tabname = (
  34. substring (
  35. sub_tab_name
  36. from
  37. 1 for length (tabname)
  38. )
  39. )
  40. ) then
  41. st_time := substring (
  42. sub_tab_name
  43. from
  44. length (tabname) + 2 for length (sub_tab_name)
  45. ) ; st_time := substring (st_time from 1 for 4) || '-' || substring (st_time from 5 for 6) ; sql_desc := 'create or replace rule insert_' || sub_tab_name || ' as on insert to ' || tabname || ' where new.' || timefield || ' >= ''' || substring (
  46. to_char(
  47. to_timestamp(st_time,'yyyy-mm-dd'),'yyyy-mm-dd'
  48. )
  49. from
  50. 1 for 10
  51. ) || '''::date and new.' || timefield || ' <''' || substring (
  52. to_char(
  53. to_timestamp(st_time,'yyyy-mm-dd') + interval '1 month','yyyy-mm-dd'
  54. )
  55. from
  56. 1 for 10
  57. ) || '''::date do instead insert into ' || sub_tab_name || '(' ; value_desc := 'values (' ; open fetch_sub_column_refcursor ; loop fetch fetch_sub_column_refcursor into column_name_desc ;
  58. if found then
  59. sql_desc := sql_desc || column_name_desc || ',' ; value_desc := value_desc || 'new.' || column_name_desc || ',' ;
  60. else
  61. exit ;
  62. end
  63. if ;
  64. end loop ; sql_desc := substring (
  65. sql_desc
  66. from
  67. 1 for length (sql_desc) - 1
  68. ) || ')' ; value_desc := substring (
  69. value_desc
  70. from
  71. 1 for length (value_desc) - 1
  72. ) || ');' ; all_sql_desc := sql_desc || value_desc ; execute all_sql_desc ; close fetch_sub_column_refcursor ;
  73. else
  74.  
  75. end
  76. if ;
  77. else
  78.  
  79. end
  80. if ;
  81. else
  82. exit ;
  83. end
  84. if ;
  85. end loop ; close fetch_sub_tab_refcursor ; return fetch_sub_tab_refcursor ; exception
  86. when others then
  87. raise exception 'error--(%)',sqlerrm ;
  88. end ; $body$ language plpgsql;
  89.  
  90. --------调用方式----有两个参数,第一个是主表名,第二个是根据哪个字段进行分表------
  91. begin
  92. ;
  93.  
  94. select
  95. cursor_demo (
  96. 'your_table_name','your_field'
  97. );
  98.  
  99. commit;

猜你在找的Postgre SQL相关文章