PostgreSQLは自動採番ID(通常、主キーに使用)を生成する際に、シーケンス——ユニークな増加する番号を生成する特別なオブジェクト——を使用します。**SERIALはシーケンスを自動的に作成するためのショートハンドであり、IDENTITY**は最新のSQL標準の同等物です。
SERIALクラシックなショートハンド
users (
id SERIAL ,
name TEXT
);
users (name) ();
PostgreSQLは自動採番ID(通常、主キーに使用)を生成する際に、シーケンス——ユニークな増加する番号を生成する特別なオブジェクト——を使用します。**SERIALはシーケンスを自動的に作成するためのショートハンドであり、IDENTITY**は最新のSQL標準の同等物です。
users (
id SERIAL ,
name TEXT
);
users (name) ();
SERIALはシーケンスを自動的に作成し、そのカラムのデフォルト値をシーケンスから次の値を取得するように設定します。BIGSERIALはより大きい範囲を扱うためにBIGINTを使用します(約20億行を超える可能性があるテーブルの場合、重要です)。
CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- SQL-standard, recommended
name TEXT
);
-- GENERATED ALWAYS → you can't manually insert a value (cleaner)
-- GENERATED BY DEFAULT → allows manual override when needed
GENERATED ... AS IDENTITYは最新のSQL標準アプローチ(新しいコードではSERIALより推奨)で、より洗練されており、いくつかのSERIALの問題(所有権/権限の境界線ケースなど)を回避します。
CREATE SEQUENCE my_seq START 1 INCREMENT 1;
SELECT nextval('my_seq'); -- get the next value (advances the sequence)
SELECT currval('my_seq'); -- the last value YOU got
SELECT setval('my_seq', 100); -- set the current value
シーケンスは独立したカウンターです。SERIAL/IDENTITYは内部で1つを使用します。注意:シーケンスはトランザクションによってロールバックされません(したがってロールバック後にIDにギャップが生じることができます——正常かつ予想される動作です)。
-- RETURNING — get the generated id back from an INSERT (very useful)
INSERT INTO users (name) VALUES ('Ann') RETURNING id;
自動採番IDは基本的な考え方です——ほぼすべてのテーブルはユニークな主キーが必要であり、自動生成される連続IDが標準的なアプローチであるため、PostgreSQLがこれをどのように処理するかを理解することは日常的な必須知識です。
SERIAL(シーケンスを自動的に作成するクラシックで一般的なショートハンド)、特に**IDENTITY**(GENERATED ... AS IDENTITY——最新のSQL標準で、新しいコードで推奨される手法で、より洗練されており、SERIALの問題を回避します)を知ることは、主キーを正しく定義するために重要です。
基盤となるシーケンス(ユニークな増加する値を生成する独立したカウンター)を理解することで、自動採番の仕組みが明確になり、高度な制御(nextval、setval)に有用です。
2つの実用的なポイントが重要です:大きく成長する可能性があるテーブルに対して**BIGSERIAL/BIGINT`を選択する(整数オーバーフロー——実際の懸念——を回避)こと、およびシーケンスはトランザクションによってロールバックされない**こと(ロールバックや失敗したインサート後にIDにギャップが生じることができます——正常で予想される動作で、いくつかの人を驚かせます)。
INSERTから生成されたIDを取得するための**RETURNING**句も、有用な日常的知識です。
すべてのテーブルが主キーを必要とし、自動採番IDが標準であり、SERIALと推奨されるIDENTITY、基盤となるシーケンス、サイズ設定(BIGSERIAL)、ギャップの動作、RETURNINGを理解することが実用的なニーズをカバーしているため、PostgreSQLが自動採番IDをどのように生成するかを知ることは基本的で、頻繁に適用される知識です。これはPostgresテーブルの操作における知識であり、最新のベストプラクティス(IDENTITY)を知ることは現在のPostgresの能力を反映しています。