スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PL/pgSQLでランダムでユニークな値をinsertする

前回、ランダムな文字列を生成する関数を作ったので、それを利用してユニークなランダム文字列をテーブルにinsertする関数を書いてみます。

CREATE TABLE t_key (key_id bigint, key_name text, PRIMARY KEY(key_id), UNIQUE (key_name));

このテーブルのkey_nameがランダムな文字列になります。
普通にinsertしようとするとunique制約がかかっているため、ランダムだと失敗する可能性があります。
失敗したら、やり直す感じで組んでいきます。


CREATE OR REPLACE FUNCTION get_new_key(
p_key_length int
) RETURNS text AS $$
DECLARE
w_result text := '';
BEGIN
LOOP
BEGIN
w_result = string_random(p_key_length);
INSERT INTO t_key (
key_id
,key_name
) VALUES (
(SELECT COALESCE(MAX(key_id),0) + 1 FROM t_key),
w_result
);
EXIT;
EXCEPTION
WHEN unique_violation THEN
NULL;
END;
END LOOP;
RETURN w_result;
END;
$$ LANGUAGE plpgsql;


ループでぐるぐるまわして、登録に成功したら、insertの次の行のEXITでループから抜けることになります。
失敗すると、EXITにたどり着く前に、EXCEPTIONのハンドラに落ちます。
unique_violationは主キーやユニークキーなどの同じ値を入れようとしました、という例外になります。
ハンドラ内の「NULL;」は何も処理をしないという意味です。それからEND LOOPにたどり着いて、LOOPまで戻ります。

この関数はWebシステムのセッションキーの発行やパスワード変更の一時URLの発行などに実際に使用しています。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。