如何管理数据库表中的唯一DateTime字段

时间:2013-01-23 16:06:44

标签: c# sql sql-server

我正在使用Visual Studio 2010,Windows XP和SQL Server CE。

我想创建一个这样的数据库表:

CREATE TABLE Logs  
(  
    Id int,  
    ***LogTime datetime***,  
    Register1 smallint,  
    Register2 smallint,  
    Register3 smallint,  
)  

Id将是主键和身份。

我遇到了无法解决的问题:

  1. 此表格将由 大量批量插入 填充(即使最多可达300k条记录),因为“数据源”将是来自USB插件的文件进入PC。此二进制格式的文件包含按时间排序的日志。我的软件必须抓住它,解码它并准备记录 添加 到数据库。
  2. db中不能有重复的日期时间(具有相同日期时间的2条记录),因为最终将从该表的数据中生成图表。
  3. 所以第一个批量插入会很好,例如:

    1, 2013-01-01 12:34:12, 12, 100, 200  
    2, 2013-01-01 12:34:24, 13, 100, 212  
    3, 2013-01-01 12:34:36, 11, 110, 208  
    ...  
    100, 2013-01-01 14:04:58, 15, 120, 198  
    

    但要插入的下一个文件将包含旧内容+其他新的后续记录。我只需要插入新记录(另外我正在创建记录副本)。

    因此
    档案1:从1月1日到1月5日 档案2:从1月1日到1月8日

    目前我已将数据库表实现为平面二进制文件,在插入之前,我会找到带有O(N)线性扫描的“插入点”,然后我可以附加新数据。

    我想使用SQL Server CE而不是平面二进制文件作为数据容器。

    任何建议都将受到赞赏

2 个答案:

答案 0 :(得分:1)

我建议您将数据批量插入临时表(先截断它),然后使用EXCEPT子句仅插入新记录。

INSERT INTO Logs (LogTime, Register1, Register2, Register3)
SELECT LogTime, Register1, Register2, Register3 FROM LogStaging
EXCEPT
SELECT LogTime, Register1, Register2, Register3 FROM Logs

答案 1 :(得分:1)

由于您提到“按时间排序的日志”,我假设您插入的记录不可能来自最后一次插入之前。例如,日期始终是唯一的,始终是升序。 (例如,某些程序每隔12秒就会在文件中添加一条记录。)

在这种情况下,创建一个变量来保存最近的日期:

DECLARE @Last_Datetime DATETIME

然后只需创建一个临时表,该表与您计划插入的表的模式相匹配:

CREATE TABLE dbo.#Temp_Logs  
(
    LogTime datetime, 
    Register1 smallint,  
    Register2 smallint,  
    Register3 smallint,  
)

批量插入该表。

然后抓住最近的记录:

SELECT @Last_Datetime = MAX(L.LogTime)
FROM dbo.Logs as L

然后使用带有INSERT SELECT子句的WHERE来移动行:

INSERT Logs
SELECT
    TL.datetime,
    TL.Register1,
    TL.Register2,
    TL.Register3
FROM dbo.#Temp_Logs AS TL
WHERE TL.datetime > @Last_Datetime