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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postgresql存储函数实现大量模拟数据插入

發布時間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 postgresql存储函数实现大量模拟数据插入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.準備數據:

創建兩張表count_group和person_face_flow

-- DROP TABLE public.count_group;CREATE TABLE public.count_group (id character varying COLLATE pg_catalog."default" NOT NULL,name character varying(64) COLLATE pg_catalog."default" NOT NULL,type integer NOT NULL,is_delete integer NOT NULL DEFAULT 0,area integer,create_time timestamp with time zone,update_time timestamp with time zone,region_id character varying(48) COLLATE pg_catalog."default" NOT NULL,CONSTRAINT count_group_pkey PRIMARY KEY (id) )-- DROP TABLE public.person_face_flow;CREATE TABLE public.person_face_flow (id character varying(36) COLLATE pg_catalog."default" NOT NULL,group_id character varying(36) COLLATE pg_catalog."default" NOT NULL,stat_time timestamp without time zone,create_time timestamp without time zone NOT NULL,update_time timestamp without time zone NOT NULL,in_number integer,out_number integer,gender character varying(20) COLLATE pg_catalog."default",age_type character varying(20) COLLATE pg_catalog."default",CONSTRAINT person_face_flow_pkey PRIMARY KEY (id) )

2.生成模擬數據的腳本:

  • count_group表插入400條模擬數據
  • create extension IF NOT EXISTS "uuid-ossp"; DO $$DECLARE formatStr text := 'INSERT INTO count_group (id, name, type, is_delete, area,region_id,create_time,update_time)values ((SELECT uuid_generate_v4()), ''統計組_''||''%s'',''%s'',0,''%s'',uuid_generate_v4(),now(),now())';DECLARE exe_sql text;DECLARE random_base INTEGER := 100;DECLARE i int :=1;DECLARE gender_array text[] := '{0,1,2,3}';DECLARE gender text;BEGINWHILE i<101 LOOPFOREACH gender IN Array gender_array LOOPexe_sql = format(formatStr,i,gender,random_base);execute exe_sql;END LOOP;i:=i+1;END LOOP; END $$;
  • person_face_flow表插入模擬數據
  • create extension IF NOT EXISTS "uuid-ossp"; DO $$DECLARE formatStr text := 'INSERT INTO person_face_flow (id, group_id, stat_time, create_time, update_time,in_number,out_number,gender,age_type) SELECT uuid_generate_v4(),''%s'',generate_series(''%s''::TIMESTAMPtz,''%s''::TIMESTAMPtz,''1 day'') ,now(),now(),''%s'',''%s'',''%s'',''%s'';'; DECLARE exe_sql text;DECLARE start_time TIMESTAMPTZ := '2019-01-01' ; DECLARE end_time TIMESTAMPTZ := '2019-02-01'; DECLARE temp_end TIMESTAMPTZ; DECLARE is_random BOOLEAN := true; DECLARE random_base INTEGER := 100; DECLARE month_time TIMESTAMPTZ; DECLARE month_time_end TIMESTAMPTZ; DECLARE record_item RECORD;DECLARE gender_array text[] := '{male,female,unknow}'; DECLARE gender text; DECLARE age_array text[] := '{child,youth,old}'; DECLARE age text;BEGINFOR record_item IN (SELECT id FROM count_group where is_delete=0) LOOPFOREACH gender IN Array gender_array LOOPFOREACH age IN Array age_array LOOPmonth_time = start_time;month_time_end = end_time;while month_time < month_time_end LOOPtemp_end = month_time + interval '1 week' - interval '1 day';if(temp_end > end_time) then temp_end = end_time;end if;exe_sql = format(formatStr,record_item.id,month_time,temp_end, (random()*100)::int , (random()*100)::int,gender,age);execute exe_sql;month_time = month_time + interval '1 week';END LOOP;END LOOP;END LOOP;END LOOP; END $$;

    3.總結說明

    1. 生成序列

    SELECT generate_series(1,10)

    generate_series函數

    函數參數類型返回類型描述
    generate_series(start, stop)int 或 bigintsetof int 或 setof bigint(與參數類型相同)生成一個數值序列,從start 到 stop,步進為一
    generate_series(start, stop, step)int 或 bigintsetof int 或 setof bigint(與參數類型相同)生成一個數值序列,從start 到 stop,步進為step
    generate_series(start, stop, step_interval)timestamp or timestamp with time zonetimestamp 或 timestamp with time生成一個數值序列,從start 到 stop,步進為step

    2. 生成字符串

    生成36位的UUID字符串

    SELECT uuid_generate_v4()

    生成32位隨機字符串,但是測試發現如循環100萬次,會出現重復,所以最好可以選擇序列或者36位uuid去除-線

    select md5(random()::text)

    生成重復字符串

    -- abc重復多次的字符串SELECT repeat('abc',(random()*4)::integer);-- 重復2次的MD5字符串select repeat(md5(random()::text),2);

    連接符

    select concat('a', ' ', 'b');

    3. 生成隨機數

    生成100以內的隨機數字

    select (random()*100)::int

    生成100以內,總位數為4,小數點后2位的小數

    SELECT (random()*100.)::numeric(4,2);

    4. 生成日期

    SELECT date(generate_series(now(), now() + '1 week', '1 day')); select generate_series(to_date('20130403','yyyymmdd'), to_date('20130404','yyyymmdd'), '3 hours'); ------------------------2013-04-03 00:00:00+082013-04-03 03:00:00+082013-04-03 06:00:00+082013-04-03 09:00:00+082013-04-03 12:00:00+082013-04-03 15:00:00+082013-04-03 18:00:00+082013-04-03 21:00:00+082013-04-04 00:00:00+08 (9 rows)

    5. 自定義函數

    生成隨機漢字

    create or replace function gen_hanzi(int) returns text as $$ declare res text; begin if $1 >=1 then select string_agg(chr(19968+(random()*20901)::int),'') into res from generate_series(1,$1); return res; end if; return null; end; $$ language plpgsql strict; --輸出漢字select gen_hanzi(10) from generate_series(1,10);

    生成隨機身份證號

    create or replace function gen_id(a date, b date) returns text as $$ select lpad((random()*99)::int::text, 2, '0') || lpad((random()*99)::int::text, 2, '0') || lpad((random()*99)::int::text, 2, '0') || to_char(a + (random()*(b-a))::int, 'yyyymmdd') || lpad((random()*99)::int::text, 2, '0') || random()::int || (case when random()*10 >9 then 'X' else (random()*9)::int::text end ) ; $$ language sql strict; --輸出身份證號select gen_id('1900-01-01', '2017-10-16') from generate_series(1,10); -------------------- 25614020061108330X 49507919010403271X 96764619970119860X 915005193407306113 551360192005045415 430005192611170108 299138191310237806 95149919670723980X 542053198501097403 482334198309182411 (10 rows)

    生成隨機數組

    create or replace function gen_rand_arr(int,int) returns int[] as $$ select array_agg((random()*$1)::int) from generate_series(1,$2); $$ language sql strict; --輸出數組 select gen_rand_arr(100,10) from generate_series(1,10); --------------------------------- {69,11,12,70,7,41,81,95,83,17} {26,79,20,21,64,64,51,90,38,38} {3,64,46,28,26,55,39,12,69,76} {66,38,87,78,8,94,18,88,89,1} {6,14,81,26,36,45,90,87,35,28} {25,38,91,71,67,17,26,5,29,95} {82,94,32,69,72,40,63,90,29,51} {91,34,66,72,60,1,17,50,88,51} {77,13,89,69,84,56,86,10,61,14} {5,43,8,38,11,80,78,74,70,6} (10 rows)

    例:

    select generate_series(1,5), (random()*100)::int, (random()*20.)::numeric(4,2), gen_hanzi(3), uuid_generate_v4()

    結果:

    總結

    以上是生活随笔為你收集整理的postgresql存储函数实现大量模拟数据插入的全部內容,希望文章能夠幫你解決所遇到的問題。

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