PostgreSQLにおけるAUTO_INCREMENTに相当するデータ型
PostgreSQLにおけるAUTO_INCREMENTに相当するデータ型
MySQLのAUTO_INCREMENTは、PostgreSQLではいくつかのデータ型で実現できます。それぞれのデータ型には、わずかな違いと利点・欠点があります。
データ型
- SERIAL - 最も一般的で、自動的に1から始まる整数値を生成します。
- BIGSERIAL - SERIALと同様ですが、より大きな値を格納できます。
- INT - SERIALと同様ですが、シーケンス名を指定できます。
詳細
SERIAL
- シンプルで使いやすい
- 主に主キーとして使用
- シーケンス名はデフォルトで
_id
- SERIALと同様だが、最大値が2147483647から9223372036854775807へ増加
SMALLSERIAL
- SERIALと同様だが、最大値が32767から2147483647へ減少
INT
- シーケンス名を自由に指定可能
- 複数列で構成される主キーの一部として使用可能
例
-- SERIAL
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255)
);
-- BIGSERIAL
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
total_price NUMERIC(10,2)
);
-- SMALLSERIAL
CREATE TABLE products (
id SMALLSERIAL PRIMARY KEY,
quantity INT
);
-- INT with custom sequence name
CREATE TABLE posts (
id INT PRIMARY KEY DEFAULT nextval('post_id_seq'),
title VARCHAR(255)
);
注意点
- SERIAL, BIGSERIAL, SMALLSERIALは、変更できないデフォルトのシーケンスを使用します。
- INTを使用する場合は、シーケンスを事前に作成する必要があります。
- シーケンス名は、テーブル名と一意である必要があります。
-- テーブル作成
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255)
);
-- データ挿入
INSERT INTO users (name) VALUES ('John Doe');
INSERT INTO users (name) VALUES ('Jane Doe');
-- データ確認
SELECT * FROM users;
-- 結果
-- id | name
-- -- | --
-- 1 | John Doe
-- 2 | Jane Doe
-- テーブル作成
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
total_price NUMERIC(10,2)
);
-- データ挿入
INSERT INTO orders (total_price) VALUES (100.00);
INSERT INTO orders (total_price) VALUES (200.00);
-- データ確認
SELECT * FROM orders;
-- 結果
-- id | total_price
-- -- | --
-- 1 | 100.00
-- 2 | 200.00
-- テーブル作成
CREATE TABLE products (
id SMALLSERIAL PRIMARY KEY,
quantity INT
);
-- データ挿入
INSERT INTO products (quantity) VALUES (10);
INSERT INTO products (quantity) VALUES (20);
-- データ確認
SELECT * FROM products;
-- 結果
-- id | quantity
-- -- | --
-- 1 | 10
-- 2 | 20
INT with custom sequence name
-- シーケンス作成
CREATE SEQUENCE post_id_seq;
-- テーブル作成
CREATE TABLE posts (
id INT PRIMARY KEY DEFAULT nextval('post_id_seq'),
title VARCHAR(255)
);
-- データ挿入
INSERT INTO posts (title) VALUES ('My first post');
INSERT INTO posts (title) VALUES ('My second post');
-- データ確認
SELECT * FROM posts;
-- 結果
-- id | title
-- -- | --
-- 1 | My first post
-- 2 | My second post
実行方法
- PostgreSQLサーバーを起動します。
- psqlコマンドラインクライアントを起動します。
- 上記のサンプルコードをpsqlクライアントに貼り付けて実行します。
PostgreSQLにおけるAUTO_INCREMENTに相当するデータ型のその他の方法
DEFAULT キーワードを使用して、挿入時に自動的に生成される値を指定できます。
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
上記の例では、created_at
列は挿入時に自動的に現在の日時が挿入されます。
トリガーを使用して、挿入時に自動的に値を生成できます。
CREATE TRIGGER generate_id BEFORE INSERT ON users
FOR EACH ROW
BEGIN
NEW.id = nextval('users_id_seq');
END;
上記の例では、users
テーブルに挿入される前に、users_id_seq
シーケンスの次の値がid
列に自動的に挿入されます。
外部キーを使用して、別のテーブルの値を自動的に生成できます。
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT REFERENCES users (id)
);
上記の例では、orders
テーブルのuser_id
列は、users
テーブルのid
列を参照します。orders
テーブルに新しい行を挿入すると、user_id
列は自動的にusers
テーブルの既存のIDに設定されます。
これらの方法は、AUTO_INCREMENTの代替手段として使用できますが、いくつかの制限があります。
- DEFAULT キーワードは、単純な値のみを生成できます。
- トリガーは、より複雑なロジックを実装できますが、コード量が増えてしまいます。
- 外部キーは、別のテーブルに依存するため、データ構造が複雑になります。
postgresql auto-increment