DBAtlas · 数据库运维图谱

创建序列 / 自增值

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 10

INCR/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 是随每次写入递增的内部序列号,但它用于乐观并发控制,而不是应用计数器。

在 DBAtlas 中打开 →