PostgreSQL INSERT文にUUIDを生成する3つの方法(uuidgenコマンド、uuid_generate_v4()関数、DEFAULT制約)
PostgreSQLでINSERT文にUUIDを生成する方法
gen_random_uuid()関数を使う
PostgreSQL 8.4以降では、pgcrypto
モジュールに含まれるgen_random_uuid()
関数を用いて、バージョン4のUUIDを生成できます。この関数は、ランダムに生成されたUUIDを返します。
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (gen_random_uuid(), 値2, ...);
uuid_generate_v4()関数を使う
uuid-ossp
モジュールをインストールすると、uuid_generate_v4()
関数が利用できます。この関数は、gen_random_uuid()
関数と同様、バージョン4のUUIDを生成します。
CREATE EXTENSION IF NOT EXISTS uuid-ossp;
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (uuid_generate_v4(), 値2, ...);
uuidgen
コマンドは、コマンドラインからUUIDを生成することができます。生成されたUUIDをINSERT文に直接記述することができます。
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES ('$(uuidgen)', 値2, ...);
DEFAULT制約を使う
カラムにDEFAULT制約としてgen_random_uuid()
関数を指定すると、INSERT文で値を指定しなくても自動的にUUIDが生成されます。
CREATE TABLE テーブル名 (
カラム名1 UUID PRIMARY KEY DEFAULT gen_random_uuid(),
カラム名2 VARCHAR(255),
...
);
INSERT INTO テーブル名 (カラム名2, ...)
VALUES (値2, ...);
- バージョン4のUUIDを生成したい場合は、
gen_random_uuid()
関数またはuuid_generate_v4()
関数がおすすめです。 - 他のバージョンのUUIDを生成したい場合は、
uuid-ossp
モジュールの他の関数を使いましょう。 - コマンドラインからUUIDを生成したい場合は、
uuidgen
コマンドが便利です。 - INSERT文で値を省略したい場合は、DEFAULT制約を使うと便利です。
その他の注意点
- UUIDは128ビットの値であり、16進文字列で表現されます。
- UUIDは重複する可能性がありますが、非常に低い確率です。
- UUIDは、データベースの主キーとしてよく使われます。
補足
- 上記の解説は、PostgreSQL 8.4以降を対象としています。
uuid-ossp
モジュールは、PostgreSQLに標準で含まれていません。インストールが必要になります。
日本語で分かりやすく解説
-- サンプルテーブルの作成
CREATE TABLE テーブル名 (
カラム名1 UUID PRIMARY KEY DEFAULT gen_random_uuid(),
カラム名2 VARCHAR(255),
...
);
-- `gen_random_uuid()`関数を使う
INSERT INTO テーブル名 (カラム名2, ...)
VALUES ('値2', ...);
-- `uuid_generate_v4()`関数を使う (uuid-osspモジュールが必要)
CREATE EXTENSION IF NOT EXISTS uuid-ossp;
INSERT INTO テーブル名 (カラム名2, ...)
VALUES (uuid_generate_v4(), 値2, ...);
-- `uuidgen`コマンドを使う
INSERT INTO テーブル名 (カラム名2, ...)
VALUES ('$(uuidgen)', 値2, ...);
-- DEFAULT制約を使う
INSERT INTO テーブル名 (カラム名2, ...)
VALUES (値2, ...);
- 最初の
CREATE TABLE
文は、サンプルテーブルを作成します。 - 2番目の
INSERT INTO
文は、gen_random_uuid()
関数を使ってUUIDを生成します。
実行方法
上記のサンプルコードを実行するには、PostgreSQLデータベースが必要です。
PostgreSQLデータベースをインストールしたら、以下のコマンドを実行してサンプルコードを実行できます。
psql -d データベース名 < サンプルコード.sql
注意
サンプルコードを実行する前に、データベース名とテーブル名を適切な値に変更してください。
PostgreSQLでINSERT文にUUIDを生成する方法
uuid_generate_v1mc()、uuid_generate_v3()、uuid_generate_v5()関数を使う
uuid-ossp
モジュールをインストールすると、uuid_generate_v1mc()
、uuid_generate_v3()
、uuid_generate_v5()
関数が利用できます。これらの関数は、それぞれバージョン1、3、5のUUIDを生成します。
-- バージョン1のUUIDを生成
CREATE EXTENSION IF NOT EXISTS uuid-ossp;
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (uuid_generate_v1mc(), 値2, ...);
-- バージョン3のUUIDを生成
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (uuid_generate_v3(NAMESPACE, '値'), 値2, ...);
-- バージョン5のUUIDを生成
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (uuid_generate_v5(NAMESPACE, '値'), 値2, ...);
引数
NAMESPACE
: UUIDの命名空間を指定する文字列値
: UUIDを生成する基になる値
pgcryptoモジュールのuuid_in()、uuid_out()関数を使う
pgcrypto
モジュールには、UUIDを文字列とバイナリデータの間で変換するuuid_in()
、uuid_out()
関数があります。これらの関数を使って、外部で生成したUUIDをINSERT文に挿入することができます。
-- 外部で生成したUUIDを挿入
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (uuid_in('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), 値2, ...);
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
: UUIDを表す文字列
トリガーを使って、INSERT時に自動的にUUIDを生成することができます。
CREATE TRIGGER トリガー名
BEFORE INSERT ON テーブル名
FOR EACH ROW
BEGIN
NEW.カラム名1 := gen_random_uuid();
END;
トリガーの例
上記のトリガーは、テーブル名テーブル名
にレコードが挿入される前に、カラム名1
カラムにgen_random_uuid()
関数で生成されたUUIDを割り当てます。
PostgreSQLでINSERT文にUUIDを生成するには、いくつかの方法があります。どの方法を使うべきかは、状況によって異なります。
postgresql uuid postgresql-8.4