シーケンス/自動採番の値を作成
Oracle
-- Sequence
CREATE SEQUENCE customer_seq START WITH 1 INCREMENT BY 1 NOCACHE;
SELECT customer_seq.NEXTVAL FROM dual;
-- or an identity column (12c+)
CREATE TABLE customer (id NUMBER GENERATED ALWAYS AS IDENTITY, name VARCHAR2(100));従来の方法は CREATE SEQUENCE + NEXTVAL/CURRVAL。12c 以降は GENERATED AS IDENTITY 列もサポートされる。CACHE 値は性能を向上させるが、欠番が生じることがある。
PostgreSQL
-- Sequence
CREATE SEQUENCE customer_seq START 1 INCREMENT 1;
SELECT nextval('customer_seq');
-- Modern method: identity column
CREATE TABLE customer (id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text);
-- Classic: serial (creates a sequence behind the scenes)
CREATE TABLE logs (id serial PRIMARY KEY, message text);GENERATED ... AS IDENTITY は SQL 標準で推奨される。serial は従来の省略形。手動では nextval/currval でアクセスする。値は setval でリセットできる。
MySQL
-- AUTO_INCREMENT column
CREATE TABLE customer (id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100));
-- Set the starting value
ALTER TABLE customer AUTO_INCREMENT = 1000;
-- Get the last inserted value
SELECT LAST_INSERT_ID();MySQL には独立した(標準の)シーケンスオブジェクトがなく、AUTO_INCREMENT 列を使用する(テーブルごとに 1 つ、インデックスが必要)。MariaDB 10.3+ は CREATE SEQUENCE をサポートする。
SQL Server
-- IDENTITY column
CREATE TABLE customer (id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(100));
-- Standalone sequence object
CREATE SEQUENCE customer_seq AS INT START WITH 1 INCREMENT BY 1;
SELECT NEXT VALUE FOR customer_seq;IDENTITY(seed,increment) はテーブルの列に紐付く。CREATE SEQUENCE(2012+)はテーブルから独立し、複数テーブルで共有できるカウンタを提供する。値は NEXT VALUE FOR で取得する。
MongoDB
// MongoDB has no auto counter; counter pattern with findOneAndUpdate
db.counters.findOneAndUpdate(
{ _id: "customer" },
{ $inc: { seq: 1 } },
{ upsert: true, returnDocument: "after" }
);デフォルトの _id は ObjectId(既に一意で、おおむね増加する)。連番の整数が必要なら、別の counters コレクションで $inc によりアトミックに生成する。
Redis
# Atomic counter
INCR customer:id
# or with a specific step
INCRBY customer:id 10INCR/INCRBY はアトミックで、分散環境で一意の増加 ID を生成するのに最適。キーが存在しなければ 0 から開始する。
Elasticsearch
# Not applicable: Elasticsearch does not offer a sequence object. Document IDs are assigned automatically;
# the internal _seq_no and _primary_term fields are used for concurrency control.
POST logs/_doc
{ "message": "sample" }ID なしで POST すると、ES はランダムな一意の _id(増加しない)を割り当てる。_seq_no は書き込みごとに増加する内部シーケンス番号だが、楽観的同時実行制御用であり、アプリケーションのカウンタではない。