Kri*_*ner 1 t-sql sql-server datetime primary-key
让我们忽略a datetime
被用作主键的事实.
鉴于以下内容:
DECLARE @table table (test datetime primary key)
INSERT INTO @table
(
test
)
select
'2015-09-21 00:00:00.001' -- test - datetime
-- successful insert
INSERT INTO @table
(
test
)
select
'2015-09-21 00:00:00.002' -- test - datetime
-- successful insert
INSERT INTO @table
(
test
)
select
'2015-09-21 00:00:00.003' -- test - datetime
-- fails due to primary key violation
select * from @table
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?所有这三个"未遂"插入值是不同的,但.002
和.003
被认为是"相同的值"
Sea*_*nge 12
datetime数据类型没有那么多精度.尝试此查询以查看这些值会发生什么.datetime数据类型仅精确到.003.https://msdn.microsoft.com/en-us/library/ms187819.aspx
select CAST('2015-09-21 00:00:00.001' as datetime) union all
select '2015-09-21 00:00:00.002' union all
select '2015-09-21 00:00:00.003'
Run Code Online (Sandbox Code Playgroud)
datetime值四舍五入为.000,.003或.007秒的增量,如下表所示.
来源MSDN SQL Server Datetime
因此,您的表值2015-09-21 00:00:00.002
四舍五入到2015-09-21 00:00:00.003
您的上一次插入,您将获得主键违规.
日期时间可能是让您使用主键的最差数据类型之一.在表中查找备用列或添加代理列以充当主键列.