Django无法插入重复的键值NULL

时间:2017-02-14 19:23:45

标签: python sql-server django database

我需要在enc_id中允许NULL,但如果值不为null,我需要这些值是唯一的。这是我的模特:

class Intake(models.Model):
    id = models.AutoField(primary_key=True)
    enc_id = models.IntegerField(blank=True, null=True, unique=True)
    enc_date = models.DateField(null=True)
    enrollment = models.ForeignKey('Enrollment')

尝试添加另一个没有enc_id的实例时出错:

django.db.utils.IntegrityError: ('23000', "[23000] [FreeTDS][SQL Server]Violation of UNIQUE KEY constraint 'UQ__caseload__E136D21F4222D4EF'. Cannot insert duplicate key in object 'dbo.caseload_intake'. The duplicate key value is (<NULL>). (2627) (SQLExecDirectW)")

根据我读过的内容(包括this和一些已解决的Django问题),blank=True, null=True, unique=True应该允许我有重复的NULL,但是没有去。为了以防万一,我重新创建了我的数据库,但它仍然会引发完整性错误。

我正在运行Django 1.10和MS SQL Server 10.有什么想法吗?

2 个答案:

答案 0 :(得分:1)

紫芝,

对于我来说,拥有一个可以有重复NULL的唯一字段对我来说没有多大意义。你通过其他手段删除约束并强化这个规则怎么样?

例如,您可以覆盖方法save以执行此操作..

def save(self, *args, **kwargs):
    # place your logic here

我希望这是有道理的,但是数据库级别的规则,例如你所定义的规则,是非常有限的。

答案 1 :(得分:1)

对于将来遇到这种情况的用户-这是MS SQL Server的限制。 ANSI标准要求UNIQUE索引不包含重复值-SQL Server(但不是其他数据库)认为NULL等于NULL-许多其他数据库(例如Postgres)和ANSI标准(从92开始)都将NULL视为未知值,这意味着与另一个未知值不同-在SQL SELECT WHERE __ IS NULL vs WHERE ___ = NULL中考虑。 SQL Server有一个ANSI_NULLS标志,实际上在查询中强制使用IS(NOT)NULL而不是xyz = / <> NULL符合标准,但这在索引中没有相同的作用。

更多有关非Django的信息:https://www.sqlservergeeks.com/sql-server-unique-constraint-multiple-null-values/