在数据库中,有时候需要批量建立数据表进行测试,如果要建立的表太多,用直接用create table 的方式可能比较繁琐,在这里写了一个批量建立数据表的sql函数,以后批量建立就简单了。
首先需要建立一个表空间用于专门存储这些表的磁盘位置。
表空间:
-- Tablespace: post_data2
-- DROP TABLESPACE post_data2;
CREATE TABLESPACE post_data2
OWNER postgres
LOCATION ‘F:\post_data2‘;
ALTER TABLESPACE post_data2
OWNER TO postgres;
建表函数:
-- FUNCTION: public.create_tables(integer)
-- DROP FUNCTION public.create_tables(integer);
CREATE OR REPLACE FUNCTION public.create_tables(
table_num_in integer)
RETURNS void
LANGUAGE ‘plpgsql‘
COST 100
VOLATILE
AS $BODY$
declare
v_table_num integer :=100;
v_idx integer := 0;
v_strTable varchar :=‘‘;
v_strSql varchar :=‘‘;
begin
while v_idx < table_num_in loop
v_idx = v_idx+1;
v_strTable = CONCAT(‘table_‘, v_idx);
v_strSql = ‘create table ‘||v_strTable||‘(idx integer,log varchar)WITH (OIDS = FALSE);‘;
EXECUTE v_strSql;
end loop;
end
$BODY$;
ALTERFUNCTIONpublic.create_tables(integer)
OWNER TO postgres;
函数使用
SELECT public.create_tables(100)
执行后会建立100个表
删表函数:
-- FUNCTION: public.create_tables(integer)
-- DROP FUNCTION public.create_tables(integer);
CREATEORREPLACEFUNCTIONpublic.drop_tables(
table_num_in integer)
RETURNS void
LANGUAGE ‘plpgsql‘
COST 100
VOLATILE
AS $BODY$
declare
v_idx integer :=0;
v_strTable varchar :=‘‘;
v_strSql varchar :=‘‘;
beginwhile v_idx < table_num_in loop
v_idx = v_idx+1;
v_strTable = CONCAT(‘table_‘, v_idx);
v_strSql = ‘drop table ‘||v_strTable;
EXECUTE v_strSql;
end loop;
end
$BODY$;
ALTERFUNCTIONpublic.drop_tables(integer)
OWNER TO postgres;
增加数据函数:
-- FUNCTION: public.create_tables(integer)
-- DROP FUNCTION public.create_tables(integer);
CREATE OR REPLACE FUNCTION public.add_tables_data(
add_times_in integer,
add_pert_in integer,
table_num_in integer,
text_len_in integer)
RETURNS void
LANGUAGE ‘plpgsql‘
COST 100
VOLATILE
AS $BODY$
declare
v_idx integer := 0;
v_idx_t integer := 0;
v_strTable varchar :=‘‘;
v_strSql varchar :=‘‘;
begin
while v_idx < add_times_in loop
v_idx = v_idx+1;
while v_idx_t < table_num_in loop
v_idx_t = v_idx_t+1;
v_strTable = CONCAT(‘table_‘, v_idx_t);
v_strSql = ‘insert into ‘||v_strTable||‘(idx,log) select sn,repeat(‘‘a‘‘,‘||text_len_in||‘) from generate_series(0,‘||add_pert_in||‘,1) as sn;‘;
EXECUTE v_strSql;
end loop;
end loop;
end
$BODY$;
ALTER FUNCTION public.add_tables_data(integer,integer,integer,integer)
OWNER TO postgres;
执行如下语句,就会对100个表,进行100批次数据插入,每次每个表插入10行记录,每条记录长200字节
SELECT public.add_tables_data(
100,
10,
100,
200
)
备注:
我这里选择