PostgreSQLで大量データを投入する
PostgreSQLで大量データを投入。やり方のメモ。
まずはPL/pgSQLを使用可能にする。こいつはDBの設定になるので初回だけシェルで次のコマンドを投入。
> createlang plpgsql <必要ならスキーマ名>
で,PLpg/SQLを使用可能にしたら,データ投入用のスクリプトを書く。次のような感じでループで回すものを書けばよい。
DROP FUNCTION FUNC();CREATE FUNCTION FUNC(NUM INTEGER) RETURNS INTEGER AS 'DECLARE CNT INTEGER;DECLARE SQL TEXT;BEGIN CNT := 0; WHILE CNT < NUM LOOP SQL := ''<<INSERT INTO ...>>''; EXECUTE SQL; CNT := CNT + 1; END LOOP; RETURN CNT;END;' LANGUAGE 'plpgsql';SELECT FUNC(1000000);
見ての通りいちいちストアド登録して実行する。ストアド中に書くSQLはシングルクオートのエスケープが......といろいろ手間。
まぁ,ともかくできたらpsql等のフロントエンドで実行してやればよい。
ちなみに余談だが作ったデータをループで削除する場合はこんな感じ。
CREATE FUNCTION SHION.F_WORK() RETURNS INTEGER AS 'DECLARE CNT INTEGER;DECLARE ENTRY RECORD;DECLARE SQL TEXT;BEGIN CNT := 0; FOR ENTRY IN <<SELECT ..>> LOOP SQL := <<''DELETE ..''>>; EXECUTE SQL; CNT := CNT + 1; END LOOP; RETURN CNT;END;' LANGUAGE 'plpgsql';SELECT SHION.F_WORK();
以上まずはメモ。あとでまともに書くこと。
追記
4/10 PLpg/SQLをPL/pgSQLに誤記を修正。

MySQLのストアドはできたものの
PostgreSQLのストアドはさっぱり...
大変参考になりました!
// s_id=1,2,3の順に連番で500レコードずつ作製
CREATE OR REPLACE FUNCTION CREATE_REC(NUM INTEGER) RETURNS INTEGER AS '
DECLARE CNT INTEGER;
DECLARE SQL TEXT;
BEGIN
CNT := 1;
WHILE CNT < NUM LOOP
INSERT INTO records (id, s_id) VALUES(CNT, 1);
CNT := CNT + 1;
END LOOP;
RETURN CNT;
END;
' LANGUAGE 'plpgsql';
SELECT CREATE_REC(501);
CREATE OR REPLACE FUNCTION CREATE_REC(NUM INTEGER) RETURNS INTEGER AS '
DECLARE CNT INTEGER;
DECLARE SQL TEXT;
BEGIN
CNT := 1;
WHILE CNT < NUM LOOP
INSERT INTO records (id, s_id) VALUES(CNT, 2);
CNT := CNT + 1;
END LOOP;
RETURN CNT;
END;
' LANGUAGE 'plpgsql';
SELECT CREATE_REC(501);
CREATE OR REPLACE FUNCTION CREATE_REC(NUM INTEGER) RETURNS INTEGER AS '
DECLARE CNT INTEGER;
DECLARE SQL TEXT;
BEGIN
CNT := 1;
WHILE CNT < NUM LOOP
INSERT INTO records (id, s_id) VALUES(CNT, 3);
CNT := CNT + 1;
END LOOP;
RETURN CNT;
END;
' LANGUAGE 'plpgsql';
SELECT CREATE_REC(501);