PostgreSQL中应显式创建SEQUENCE并用nextval()绑定列,而非SERIAL;MySQL 8.0+虽支持SEQUENCE但功能受限,宜用单行表或UUID/Snowflake替代;Oracle/SQL Server序列行为差异大,需注意CACHE、START WITH等配置;跨库ID生成应由应用层统一管控,避免依赖数据库序列自动同步。
SEQUENCE 替代 SERIAL 的实际写法直接删掉 SERIAL,它只是语法糖,底层就是 SEQUENCE + DEFAULT。真正可控、可跨库迁移的写法是显式创建序列并绑定到列。
CREATE SEQUENCE user_id_seq START WITH 1 INCREMENT BY 1;DEFAULT nextval('user_id_seq'),不要用 SERIAL
SELECT setval('user_id_seq', (SELECT MAX(id) FROM users)); 同步当前最大值schema_name.sequence_name
SEQUENCE,但可以模拟MySQL 直到 8.0 才支持 SEQUENCE 对象(非标准 SQL,且功能受限),多数生产环境仍靠 AUTO_INCREMENT 或应用层生成。若硬要“跨库对齐”,得自己兜底。
CREATE SEQUENCE user_id_seq START WITH 1 INCREMENT BY 1;,但不支持 OWNED BY,必须手动在 INSERT 里写 NEXTVAL(user_id_seq)
seq_user_id)存当前值,配合 UPDATE ... RETURNING(MySQL 8.0.29+)或 SELECT ... FOR UPDATE + 应用层递增LAST_INSERT_ID() 回填,它只对 AUTO_INCREMENT 列有效,和序列无关Oracle 的 SEQU 是独立对象,SQL Server 的 
SEQUENCE 也是,但两者默认行为不同,跨库时容易漏掉关键配置。
NOCACHE,高并发下性能差;建议加 CACHE 20,但要注意实例崩溃可能导致跳号SEQUENCE 必须显式指定 START WITH 和 INCREMENT BY,否则报错;且不支持 OWNED BY,必须在 INSERT 或 DEFAULT 里调用 NEXT VALUE FOR seq_name
currval 和 nextval 是会话级的,SQL Server 中 CURRENT_VALUE 是序列自身的当前值,无需会话上下文nextval 消费就不可回退,哪怕事务回滚 —— 这点常被忽略,导致 ID 不连续却误以为出 bug真正在多个 DB 间切换或共存时,靠 DDL 对齐序列远远不够。核心矛盾不在语法,而在语义保障和运维习惯。
CHAR(36) 或 BIGINT,彻底绕开序列管理问题START WITH 1000000),给人工干预留余地;同时监控各库序列剩余可用范围(如 SELECT last_value, max_value FROM pg_sequences)setval / ALTER SEQUENCE RESTART WITH / DBCC CHECKIDENT 调整起点