PostgreSQLでUUIDを自動生成して主キーとして使う方法

こんにちは、さるまりんです。

DBテーブルの主キーとしてシーケンス(serial)をよく使います。
が、PostgreSQLではUUIDを使うこともできます。

テーブルのCREATE文はこんな感じです。

CREATE TABLE composers (
    id uuid DEFAULT uuid_generate_v4(),
    name varchar(200) not null 
);

実行してみます。

salumarine=# CREATE TABLE composers (
salumarine(#     id uuid DEFAULT uuid_generate_v4(),
salumarine(#     name varchar(200) not null 
salumarine(# );
ERROR:  function uuid_generate_v4() does not exist
LINE 2:     id uuid DEFAULT uuid_generate_v4(),
                            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

おっとエラーです。
これが出たら

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

を実行します。

salumarine=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION

で、もう一度CREATE TABLEです。

salumarine=# CREATE TABLE composers (
salumarine(#     id uuid DEFAULT uuid_generate_v4(),
salumarine(#     name varchar(200) not null 
salumarine(# );
CREATE TABLE

今度は大丈夫でした。

データを入れてみます。

insert into composers (name)
values ('Beethoven'),
       ('Bach'),
       ('Brahms'),
       ('Mozart'),
       ('Ravel'),
       ('Stravinsky');

実行してみます。

salumarine=# insert into composers (name)
salumarine-# values ('Beethoven'),
salumarine-#        ('Bach'),
salumarine-#        ('Brahms'),
salumarine-#        ('Mozart'),
salumarine-#        ('Ravel'),
salumarine-#        ('Stravinsky');
INSERT 0 6

取り出してみます。

salumarine=# select * from composers;
                  id                  |    name    
--------------------------------------+------------
 d58e6ee7-49db-4c76-aaf3-bf8596a5fd10 | Beethoven
 5b20b254-ae55-4513-8876-ce536014c88c | Bach
 aa5aa08c-ce3a-4337-ae2e-c6f96e65f5b9 | Brahms
 5bbfb696-77f9-4e75-a150-fee7fd2113c0 | Mozart
 da9ffa85-0e41-416d-a6f7-97bacc0977cf | Ravel
 174b394a-cba7-4f35-986f-33b2af717c98 | Stravinsky
(6 rows)

UUIDが自動生成されて登録されています。

これで数値ではなく、UUIDで主キーを作ることもできます。
場面に応じで利用できるといいですね。

読んでくださってありがとうございました。

それではまた!