シーケンスとは
日本語版マニュアルには、
シーケンスオブジェクト(シーケンス生成器とも単にシーケンスとも呼ばれます)とは CREATE SEQUENCE コマンドで作成される 1 行の特別なテーブルです。シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されます。
と書いてる。
めっちゃ簡単に説明すると
シーケンス = 連番を生成するモノ
という理解でOK。
主に主キーや一意のIDの生成など、連続した番号が必要な場面で使用される。
実際に使ってみる
CREATE SEQUENCE example_table_id_seq -- シーケンス名
INCREMENT BY 1 -- 増分値
MINVALUE 1 -- 最小値
MAXVALUE 2147483647 -- 最大値
START WITH 1 -- 初期値
CACHE 1; -- キャッシュ値
CREATE TABLE example_table (
-- nextval()を使ってシーケンスの次の値を取ってくる
id INTEGER PRIMARY KEY DEFAULT nextval('example_table_id_seq'),
name VARCHAR(255)
);
idにシーケンスを設定したので、試しにidの値を指定せずにインサートしてみる
INSERT INTO example_table (name) VALUES
('denji'),
('power'),
('aki');
結果、idに連番が付与されている
id | name |
---|---|
1 | denji |
2 | power |
3 | aki |
SERIAL型について
カラムのデータ型を SERIAL にすることで、前述のシーケンスの作成・設定を自動で行ってくれる。
CREATE TABLE example_table (
id SERIAL PRIMARY KEY, -- SERIAL
name VARCHAR(255)
);
内部で「テーブル名_カラム名_seq」という名前のシーケンスが自動で作成される。
例の場合、「example_table_id_seq」というシーケンスを生成。
また、SERIALを使った場合、シーケンスの設定は以下のとおり(前述の設定と同様)
CREATE SEQUENCE example_table_id_seq -- シーケンス名
INCREMENT BY 1 -- 増分値
MINVALUE 1 -- 最小値
MAXVALUE 2147483647 -- 最大値
START WITH 1 -- 初期値
CACHE 1; -- キャッシュ値
なお、データ型がINTEGERとBIGINTの場合で、MAXVALUEの値が変わる
INTEGER :2147483647
BIGINT :9223372036854775807
シーケンスに権限を付与する
勝手にシーケンスの値が変更されることのないよう、権限を付与するのがセキュリティ上重要。
-- 付与
GRANT USAGE ON SEQUENCE example_sequence TO example_user;
-- 取消
REVOKE USAGE ON SEQUENCE example_sequence FROM example_user;
- USAGE :シーケンスの値を取得できるが、変更はできない
- UPDATE: シーケンスの値を変更できる