为什么在日期时间列上违反唯一约束?

时间:2014-07-21 20:33:38

标签: sql sql-server sql-server-2008 unique-constraint

我的表格中包含IDDateTime

此表在IDDateTime

上有一个唯一键

DateTime可以为空

ID不是PK

我输入一行

ID  DATETIME
1   NULL

然后我为日期时间设置了一个值

ID  DATEIME
1   2014-07-21 13:34:098

然后我想添加一个新行来制作这样的东西

ID  DATETIME 
1   2014-07-21 13:34:098 
1   NULL

例如,具有NULL日期时间的行ID 1是当前活动行或其他内容。

现在,例如,当我将此当前活动行无效,并为ID为1的活动行插入不同的时间戳时

ID  DATETIME
1   2014-07-21 18:20:51.510
1   2014-07-21 18:28:55.710

我遭到英国违规。似乎没有意义。

时间戳不重复。

  

违反UNIQUE KEY约束UK_MyTable。无法在对象Schema.MyTable中插入重复键。重复键值为(222333,2014年7月21日下午8:26)

     

违反UNIQUE KEY约束UK_MyTable。无法在对象Schema.MyTable中插入重复键。重复键值为(1,2014年7月21日下午8:28)

任何人都可以解释为什么会发生这种情况吗?

这是他唯一的约束

ALTER TABLE [Scheme].[MyTable] ADD  CONSTRAINT [UK_MyTable] UNIQUE NONCLUSTERED 
(
    [ID] ASC,
    [DateTime] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

然后在插入新行之前更新DateTime字段

update Scheme.MyTable set DateTime = getutcdate() where ID= 1

2 个答案:

答案 0 :(得分:3)

运行此查询时

update Scheme.MyTable set DateTime = getutcdate() where ID= 1

它将使用相同的键生成2行

两个ID 1都有 SAME DateTime

是的,这将违反唯一约束

答案 1 :(得分:1)

如果这是您正在运行的查询,那么您当然会收到错误:

update Scheme.MyTable set DateTime = getutcdate() where ID= 1

没有什么可以告诉服务器你只想用NULL DateTime影响行,所以它会影响两行并尝试给它们相同的值。

也许:

update Scheme.MyTable set DateTime = getutcdate()
  where ID= 1 and DateTime is NULL