You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

容器化Django+SQL Server项目主键重启后跳增900-1000的原因?

问题原因

这是Microsoft SQL Server的IDENTITY列缓存机制导致的,和Django本身无关。

SQL Server为提升插入性能,会给IDENTITY列预分配一批数值(默认批次大小为1000)并缓存到内存中。当容器重启时,Django与SQL Server的连接断开,内存中未使用的预分配IDENTITY值会被丢弃。下次启动项目后,SQL Server会从下一个批次的起始值开始分配主键,因此出现一次性跳增900-1000的情况;而后续插入时,因为缓存的批次仍在内存中,主键会正常递增1,直到该批次用完。

解决方案

1. 接受默认行为(推荐,除非业务强制要求主键连续)

IDENTITY列的设计目的是生成唯一主键值,而非保证数值连续。主键不连续不会影响业务逻辑,还能保留SQL Server的性能优势。如果业务对主键连续性没有硬性要求,无需修改。

2. 关闭IDENTITY缓存(若必须保证连续)

如果业务场景要求主键严格连续,可以关闭SQL Server的IDENTITY缓存功能:

  • 针对单个表:执行SQL语句关闭指定表的缓存
    ALTER TABLE Contractor SET (IDENTITY_CACHE = OFF);
    
    替换Contractor为对应模型的表名,所有出现该问题的表都需执行此操作。
  • 全局关闭(不推荐):修改数据库级设置,影响所有表的IDENTITY列
    ALTER DATABASE YourDatabaseName SET IDENTITY_CACHE OFF;
    
    注意:关闭缓存会降低插入性能,因为每次插入都需要直接写入磁盘更新标识值,而非使用内存缓存。

3. 自定义主键生成(不推荐,不符合规范)

你提到的自定义增量函数虽能解决问题,但会绕过SQL Server和Django的默认主键管理机制,增加维护成本,除非万不得已不建议使用。

内容的提问来源于stack exchange,提问作者Anonymous Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:02:16