我需要在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.有什么想法吗?
答案 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/