PostgreSQL で Insert ステートメントの UUID を生成する
Shihab Sikder
2023年6月20日
UUID は、RFC-4122 で定義されている Universally Unique Identifier の略です。 テーブルの作成中にこれを使用できます。
CREATE TABLE
で UUID を使用する
UUID は、基本的に 128 ビットの 32 桁の 16 進数コードを提供します。 毎回一意の文字列を生成します。
Postgres から UUID を生成できます。 ただし、最初は次のようなエラーが表示されます。
postgres=# select uuid_generate_v4();
ERROR: function uuid_generate_v4() does not exist
LINE 1: select uuid_generate_v4()
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
そのため、uuid-ossp
モジュールをインストールする必要があります。 方法は次のとおりです。
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
これで、UUID のすべてのバージョンを作成できます。 以下に例を示します。
postgres=# SELECT uuid_generate_v1();
uuid_generate_v1
--------------------------------------
22e2579a-1c76-11ed-979f-eba332a1af20
(1 row)
postgres=# SELECT uuid_generate_v4();
uuid_generate_v4
--------------------------------------
db1c0f9f-dedb-459e-b267-d56ff06e6714
(1 row)
テーブルの列の 1つとして UUID を持つテーブルを作成しましょう。
CREATE TABLE contacts (
id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
full_name VARCHAR NOT NULL,
email VARCHAR NOT NULL,
phone VARCHAR
);
このテーブルでは、行を挿入すると、UUID が生成され、デフォルトで id
として割り当てられます。
INSERT INTO contacts(full_name, email, phone)
VALUES('Alex','alex@gmail.com','01912334355');
INSERT INTO contacts(full_name, email, phone)
VALUES('John','john@gmail.com','123456789');
-- Let's see the output
postgres=# select * from contacts;
id | full_name | email | phone
--------------------------------------+-----------+----------------+-------------
5685a3d5-7de0-47ce-9fe4-19bbbc81b531 | Alex | alex@gmail.com | 01912334355
4e4555db-9ea9-4b0b-9a71-d52d176d063d | John | john@gmail.com | 123456789
(2 rows)
ここでは、id が uuid
として生成されていることがわかります。
INSERT
ステートメント内に UUID を挿入する
上記のテーブルを変更して、UUID_v1 と UUID_v4 を保持する 2 列を増やしましょう。 変更されたテーブルは次のとおりです。
CREATE TABLE contacts
(
id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
full_name VARCHAR NOT NULL,
id_v1 uuid,
id_v4 uuid,
email VARCHAR NOT NULL,
phone VARCHAR
);
INSERT INTO contacts
(full_name, id_v1, id_v4, email, phone)
VALUES('Alex', uuid_generate_v1(),
uuid_generate_v4(),
'alex@gmail.com', '01912334355');
INSERT INTO contacts
(full_name, id_v1, id_v4, email, phone)
VALUES('John', uuid_generate_v1(),
uuid_generate_v4(),
'john@gmail.com', '123456789');
出力は次のとおりです。
postgres=# select full_name, id_v1, id_v4 from contacts;
full_name | id_v1 | id_v4
-----------+--------------------------------------+--------------------------------------
Alex | 23438c20-1c78-11ed-ad33-0bc676d6e82c | b751fa4f-39da-4e3d-ba36-b79edd1ccf9e
John | 24545572-1c78-11ed-9d3c-b3409499f6de | dece10ab-56ab-4bad-b27b-5e9c15060c52
(2 rows)
最初は、UUID ジェネレーターは PostgreSQL に存在しません。 エラーを回避するには、Postgres ステートメントで UUID ジェネレーターを使用できるように、Postgres で create extension
を実行する必要があります。
Postgres UUID の詳細については、次の ブログ にアクセスしてください。
著者: Shihab Sikder