Dav*_*b60 7 t-sql sql-server-2005
我正在进行INSERT INTO查询以初始化新表.主键是RFQ_ID和Action_Time
如何在新记录上为每个Action_Time添加1毫秒以避免"违反PRIMARY KEY约束"
INSERT INTO QSW_RFQ_Log
(RFQ_ID, Action_Time, Quote_ID)
SELECT RFQ_ID, GETDATE() AS Action_Time, Quote_ID, 'Added to RFQ on Initialization' AS Note
FROM QSW_Quote
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 12
我认为真正的问题是RFQ_ID, Action_Time
不应该成为主键.创建一个代理主键并放置一个非唯一索引RFQ_ID, Action_Time
.
更新:如果你真的想坚持你现有的设计,你可以做你所要求的,但每行之间使用10毫秒而不是一毫秒,以弥补日期时间的低精度.您可以使用行号来确定要添加的毫秒数,以便为每行获取不同的时间戳:
INSERT INTO QSW_RFQ_Log
(RFQ_ID, Action_Time, Quote_ID, Note)
SELECT
RFQ_ID,
DATEADD(millisecond, 10 * ROW_NUMBER() OVER (ORDER BY Quote_ID), GETDATE()) AS Action_Time,
Quote_ID,
'Added to RFQ on Initialization' AS Note
FROM QSW_Quote
Run Code Online (Sandbox Code Playgroud)
我同意Mark Byers的回答是真正的解决方案.只想添加一个问题,在SQL Server 2008之前,日期时间精度约为3.33ms.从MSDN引用:
datetime值四舍五入为.000,.003或.007秒的增量...
因此,添加1毫秒的日期将无法解决您的问题.
例如
SELECT DATEADD(ms, 1, '2010-04-12T12:00:00.000') -- outputs time still as x.000s
SELECT DATEADD(ms, 2, '2010-04-12T12:00:00.000') -- output: .003s
SELECT DATEADD(ms, 3, '2010-04-12T12:00:00.000') -- output: .003s
SELECT DATEADD(ms, 4, '2010-04-12T12:00:00.000') -- output: .003s
SELECT DATEADD(ms, 5, '2010-04-12T12:00:00.000') -- output: .007s
SELECT DATEADD(ms, 6, '2010-04-12T12:00:00.000') -- output: .007s
SELECT DATEADD(ms, 7, '2010-04-12T12:00:00.000') -- output: .007s
SELECT DATEADD(ms, 8, '2010-04-12T12:00:00.000') -- output: .007s
SELECT DATEADD(ms, 9, '2010-04-12T12:00:00.000') -- output: .010s
Run Code Online (Sandbox Code Playgroud)
实际上你需要每次增加3ms.充其量它可以适用于你的情况,但只是不是真正的感觉像一个"干净"的解决方案,一点点黑客.在最坏的情况下,它根本不会工作/扩展,具体取决于数据量/数据传播的密度.但是,如果你沿着这条路走下去,你应该知道日期时间的准确性.
SQL Server 2008确实引入了DATETIME2,其精度为100ns.见DaveK的回答.