postSQL使用触发器(trigger)分表
生活随笔
收集整理的這篇文章主要介紹了
postSQL使用触发器(trigger)分表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
postSQL使用觸發器(trigger)分表
腦子突發奇想到一個需求,需要把一張日志總表里的數據分到不同的子表內,每張子表的命名以_加年份結尾,不同年份的數據插到不同的子表下。想到postSQL的trigger分表的強大,所以這次寫個demo例子,實現業務——當插入子表時,若不存在該年份的子表,則自動創建該年份的子表。
首先我們需要先創一張父表作為依賴
create table if not exists tb_info(id varchar,year varchar,name varchar );然后創建觸發器函數
--創建觸發器函數 create or replace function func_tri_info() returns trigger as $$--這里定義變量declare my_tbname varchar(64);declare sql_str text; begin--這里 || 表示拼接,NEW表示這條數據的對象my_tbname = TG_TABLE_NAME || '_' || NEW.year;sql_str = 'INSERT INTO '||my_tbname ||' SELECT $1.* ';EXECUTE sql_str USING NEW;return null; --如果發生異常,就執行下面(一般來說拋找不到表的異常時就執行下面) exception when undefined_table thenbegin--這里執行創表語句,記得INHERITS前面一定要有()!!!這是個坑。execute 'create table ' || my_tbname || '()INHERITS ('|| TG_TABLE_NAME || ')';EXECUTE sql_str USING NEW;return null;exception when others thenEXECUTE sql_str USING NEW;return null;end; end; $$ language plpgsql;接著把觸發器,觸發器函數和表關聯起來
create trigger tri_ins_info before insert on tb_info for each row EXECUTE PROCEDURE func_tri_info();最后我們可以測試一哈
insert into tb_info(id, year, name) values ('1','2017', '測試2017'); insert into tb_info(id, year, name) values ('2','2018', '測試2018');執行完后我們刷新看一下數據庫表,發現多了兩張2017和2018的表
附錄
完整的SQL語句
drop table if exists tb_info; --先創一張父表 create table if not exists tb_info(id varchar,year varchar,name varchar );--刪除以前創過的觸發器和觸發器函數 drop trigger if exists tri_ins_info on tb_info; drop function if exists func_tri_info();--創建觸發器函數 create or replace function func_tri_info() returns trigger as $$declare my_tbname varchar(64);declare my_year varchar(64);declare sql_str text; begin my_tbname = TG_TABLE_NAME || '_' || NEW.year;sql_str = 'INSERT INTO '||my_tbname ||' SELECT $1.* ';EXECUTE sql_str USING NEW;return null;exception when undefined_table thenbeginexecute 'create table ' || my_tbname || '()INHERITS ('|| TG_TABLE_NAME || ')';EXECUTE sql_str USING NEW;return null;exception when others thenEXECUTE sql_str USING NEW;return null;end; end; $$ language plpgsql;create trigger tri_ins_info BEFORE insert on tb_info for each row EXECUTE PROCEDURE func_tri_info();insert into tb_info(id, year, name) values ('1','2017', '測試2017'); insert into tb_info(id, year, name) values ('2','2018', '測試2018');總結
以上是生活随笔為你收集整理的postSQL使用触发器(trigger)分表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(3074):vue+eleme
- 下一篇: react学习(53)--传参paylo