【问题标题】:Why a Violation of Unique Constraint on date time column? [closed]为什么在日期时间列上违反唯一约束? [关闭]
【发布时间】:2014-07-21 20:33:37
【问题描述】:

我有一个带有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, Jul 21 2014 8:26PM)

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

谁能解释为什么会发生这种情况?

这是他的唯一约束

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

【问题讨论】:

  • 可以粘贴你正在运行的sql插入数据吗?
  • ID 可能不是 PK,但这里显然还有另一个 UNIQUE 约束处于活动状态。检查此表的创建语句。这是什么关系型数据库?看起来很可能是 MySQL 或 PostgreSQL
  • 能否请您过去定义唯一约束的方式?
  • 听起来你是在插入而不是更新???
  • 您能分享一下您正在使用的 SQL 吗?也许创建一个 SQL Fiddle 来演示该问题。

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


【解决方案1】:

当您运行此查询时

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

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

ID1 都将具有 SAME DateTime

是的,这将违反唯一约束

【讨论】:

    【解决方案2】:

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

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

    没有什么可以告诉服务器您只想用 NULL DateTime 影响行,因此它会影响两行并尝试为它们提供相同的值。

    也许:

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

    【讨论】:

    • 啊,叹息。我没看到:(
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多