日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

postSQL使用触发器(trigger)分表

發布時間:2023/12/9 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)分表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。