시퀀스 / 자동 증가 값 생성
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 컬럼을 사용한다(테이블당 하나, 인덱스 필수). 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는 쓰기마다 증가하는 내부 시퀀스 번호지만, 애플리케이션 카운터가 아니라 낙관적 동시성 제어용이다.