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

Django操作MSSQL时IDENTITY_INSERT报错原因咨询

问题场景

执行以下Django代码操作外部MSSQL数据库时:

SORequestFromEmail.objects.create(subject='test')

触发报错:

django.db.utils.IntegrityError: ('23000', "[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert explicit value for identity column in table 'tblSORequestFromEmail' when IDENTITY_INSERT is set to OFF. (544) (SQLExecDirectW)")

对应的模型定义:

class SORequestFromEmail(models.Model):
    id = models.IntegerField(primary_key=True, db_column='ID')
    fromemail = models.TextField(db_column='FromEmail', blank=True)
    fromname = models.TextField(db_column='FromName', blank=True)
    subject = models.TextField(db_column='Subject', blank=True)
    description = models.TextField(db_column='TextDescription', blank=True)
    cc = models.TextField(db_column='CC', blank=True)
    datetimereceived = models.DateTimeField(db_column='DateTimeReceived')

    class Meta:
        db_table = u'tblSORequestFromEmail'
报错原因
  1. 字段定义与数据库特性不匹配:
    数据库中tblSORequestFromEmail表的ID列是MSSQL的自增IDENTITY列,但模型里将id定义为普通的IntegerField(primary_key=True),没有告知Django这是自增字段。

  2. Django主键默认行为触发数据库限制:
    Django创建对象时,会自动为主键字段生成默认值(如0)并尝试插入。而MSSQL的IDENTITY列在IDENTITY_INSERT关闭的默认状态下,不允许显式插入任何值(哪怕是Django自动生成的默认值),因此触发完整性约束错误。

  3. 额外潜在问题:
    模型中的datetimereceived字段未设置null=True或默认值,且创建对象时未传入该值,后续即使解决ID问题,也会触发新的非空字段报错。


内容的提问来源于stack exchange,提问作者James Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:27:27