Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么违反了日期时间列的唯一约束?_Sql_Sql Server_Sql Server 2008_Unique Constraint - Fatal编程技术网

Sql 为什么违反了日期时间列的唯一约束?

Sql 为什么违反了日期时间列的唯一约束?,sql,sql-server,sql-server-2008,unique-constraint,Sql,Sql Server,Sql Server 2008,Unique Constraint,我有一个带有ID和DateTime列的表 此表在ID和DateTime DateTime可为空 ID不是主键 我输入一行 ID DATETIME 1 NULL 后来我为日期时间设置了一个值 ID DATEIME 1 2014-07-21 13:34:098 然后我想添加一个新行,这样做 ID DATETIME 1 2014-07-21 13:34:098 1 NULL 例如,带有空datetime的行ID 1是当前活动行或其他行 现在,例如,我将使当前活动行无效,

我有一个带有
ID
DateTime
列的表

此表在
ID
DateTime

DateTime
可为空

ID
不是主键

我输入一行

ID  DATETIME
1   NULL
后来我为日期时间设置了一个值

ID  DATEIME
1   2014-07-21 13:34:098
然后我想添加一个新行,这样做

ID  DATETIME 
1   2014-07-21 13:34:098 
1   NULL
例如,带有空datetime的行ID 1是当前活动行或其他行

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

ID  DATETIME
1   2014-07-21 18:20:51.510
1   2014-07-21 18:28:55.710
我在英国违规了。似乎没有道理

时间戳不重复

违反唯一键约束UK_MyTable。无法在object Schema.MyTable中插入重复键。重复的键值为(222333,2014年7月21日8:26PM)

违反唯一键约束UK_MyTable。无法在object Schema.MyTable中插入重复键。重复的键值为(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

当您运行此查询时

update Scheme.MyTable set DateTime = getutcdate() where ID= 1
它将用相同的键排成两行

两个
ID
1将具有相同的
DateTime


因此,是的,当您运行此查询时,这将违反唯一约束

update Scheme.MyTable set DateTime = getutcdate() where ID= 1
它将用相同的键排成两行

两个
ID
1将具有相同的
DateTime


因此,是的,这将违反唯一约束

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

update Scheme.MyTable set DateTime = getutcdate() where ID= 1
没有任何东西可以告诉服务器您只想用
NULL
DateTime
影响行,因此它会影响两行,并尝试给它们相同的值

也许:

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

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

update Scheme.MyTable set DateTime = getutcdate() where ID= 1
没有任何东西可以告诉服务器您只想用
NULL
DateTime
影响行,因此它会影响两行,并尝试给它们相同的值

也许:

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

可以粘贴正在运行的sql以插入数据吗?ID可能不是PK,但这里显然存在另一个唯一的约束。检查此表的创建语句。这是什么RDBMS?看起来很可能是MySQL或PostgreSql。你能不能也说说你是如何定义唯一约束的?听起来你是在插入而不是更新???你能分享你正在使用的SQL吗?也许可以创建一个示例来说明问题。是否可以粘贴正在运行的sql以插入数据?ID可能不是PK,但这里显然存在另一个唯一的约束。检查此表的创建语句。这是什么RDBMS?看起来很可能是MySQL或PostgreSql。你能不能也说说你是如何定义唯一约束的?听起来你是在插入而不是更新???你能分享你正在使用的SQL吗?也许可以创建一个演示该问题的示例。啊,请叹气。我没看见:(唉,唉,我没看见:(