在SQL Server中,选错自增策略的代价往往要到生产环境才暴露。一个INT IDENTITY列撞上2,147,483,647上限,复制节点在同一组键上冲突,一次故障转移让计数器跳增10,000。IDENTITY适合单表单键的场景,SEQUENCE则是跨表、预分配或迁移场景的工具。但两者都无法保证数字不产生间隔。
作用域决定一切。IDENTITY绑定表,SEQUENCE属于数据库级别。两者都会产生间隔:回滚、重启、缓存刷新,数字就此消失。CACHE是SEQUENCE的性能开关,IDENTITY则没有对应的调节旋钮。可移植性方面,SEQUENCE遵循ANSI SQL,PostgreSQL、Oracle、Db2都支持,而IDENTITY是SQL Server专有。
一个真实案例:物流系统的日志表使用INT IDENTITY(1,1),写入量极大,运行三年后计数器撞上2,147,483,647上限。下一次插入直接触发算术溢出错误,该表是整个系统的写入路径,后续所有操作陷入停滞。解决方案?在9000万行数据上把列迁移为BIGINT,并且安排在计划外维护窗口执行。这张表从一开始就该用BIGINT。
IDENTITY的参数一旦设定就无法事后修改:你不能跨表重新设置种子值,不能为复制节点预分配范围,不能让计数器循环回零。当这些需求出现时,SEQUENCE才是正确的工具。
两者的工作机制如下——IDENTITY是列属性,引擎在插入时生成值,只有种子和步长两个配置项:
CREATE TABLE Customers (CustomerID INT IDENTITY(1, 1) PRIMARY KEY,CustomerName NVARCHAR(200) NOT NULLINSERT INTO Customers (CustomerName) VALUES (N'Acme Corp');-- CustomerID: 1, then 2, then 3...SEQUENCE则是独立的架构对象,可以独立创建,在需要数字的任何位置调用:
CREATE SEQUENCE dbo.OrderNumberSequenceSTART WITH 1000INCREMENT BY 1MINVALUE 1000MAXVALUE 999999CACHE 100;
热门跟贴