PostgreSQL使用序列(sequences)生成自增ID(通常用于主键)— 这些是生成唯一递增数字的特殊对象。**SERIAL是自动创建序列的简写形式,IDENTITY**是现代SQL标准的等价物。
SERIAL — 经典简写
users (
id SERIAL ,
name TEXT
);
users (name) ();
PostgreSQL使用序列(sequences)生成自增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在后台使用一个。注意:序列不被事务回滚(所以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)很有用。
两个实际要点很重要:为可能增长较大的表选择**BIGSERIAL/BIGINT`(避免整数溢出 — 这是真实的风险),以及了解序列不被**事务回滚(所以回滚或插入失败后ID可能有间隙 — 这是正常的、预期的行为,但有些人会感到惊讶)。
**RETURNING**子句用于从INSERT中获取生成的ID也很有价值,是日常知识。
由于每个表都需要主键,自增ID是标准方式,而且理解SERIAL与推荐的IDENTITY、底层序列、大小调整(BIGSERIAL)、间隙行为和RETURNING涵盖了实际需求,知道PostgreSQL如何生成自增ID对于处理Postgres表来说是基础的、经常应用的知识,也是一个常见点,了解现代最佳实践(IDENTITY)反映了当前的Postgres能力。