postgres 自動水平分表,簡單示例


創建父表:

create table test_id
(
    id integer
);

創建觸發器函數:

說明:觸發器每隔1000筆數據會插入一個新表中,當然id 需要是連續不重復的情況.

drop function if exists func_trigger_insert_test_id;
create or replace function func_trigger_insert_test_id()
    returns trigger as
$$
declare
    var_id         integer;
    var_is_exist   boolean;
    var_table_name varchar(33);
    var_sql_create text;
    var_sql_insert text;
begin
    --     獲取當前需要使用的表名:
    var_table_name = 'test_id' || trunc(new.id, -3):: varchar(33);
    var_id = trunc(new.id, -3);
    select count(1) into var_is_exist from pg_class where relname = var_table_name;
    if (var_is_exist = false) then
--         創建新的表格.
        var_sql_create := format('    create table if not exists %s
    (
         check ( id >= %s and id <= %s )
    ) inherits (test_id);', var_table_name, var_id, var_id + 999);
        raise notice 'var_id:%',var_id;
        execute var_sql_create;
    end if;
    var_sql_insert = format('insert into %I select $1.*;', var_table_name);
    execute var_sql_insert using new;

    --     表格創建完成后插入數據:
--     raise notice 'TG_RELNAME:%',tg_relname;
    raise notice 'new:%',new.id;

    return null;
end
$$
    language plpgsql
    volatile;

創建觸發器:

create trigger trigger_insert_test_id
    before insert
    on test_id
    for each row
execute procedure func_trigger_insert_test_id();

插入數據測試:

insert into test_id
select generate_series(1, 5000);

測試效果:


update 二〇二〇年〇九月十五日:
今天重新看觸發函數看不懂了!(⊙﹏⊙)b
$1代表新增的那筆記錄
using new是什么意思: 結合$1使用的相當與位置參數值。

關於execute $ using 用這個函數解釋下會比較清楚:

create or replace function func_test()
    returns timestamp
as
$$
declare
    var_test varchar(33) default 'tb';
    var_date timestamp;
begin
    var_test:='tb';
    execute 'select $1' into var_date using now();
    return var_date;
end
$$
    language plpgsql volatile;

不過變量不能用於表名和字段上。要使用還是使用%I吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM