【发布时间】:2014-06-19 19:21:06
【问题描述】:
我有一个 SQL Server 数据库,其中包含许多都连接的表,每个表都有一个主键。我有一个Dictionary,它跟踪每个表的主键字段。我的任务是每天从以属性为中心的 XML 文件中提取数据并将它们插入到主数据库中。每个 XML 文件都具有相同的架构。我通过使用XMLReader 并将数据导入DataSet 来做到这一点。
我不能使用AutoNumber 作为键。假设昨天的 XML 文件生成了一个类似于以下内容的DataTable,并将其导入到数据库中
-------------------------------------
| Key | Column1 | Column2 | Column3 |
|-----------------------------------|
| 0 | dsfsfsd | sdfsrer | sdfsfsf |
|-----------------------------------|
| 1 | dertert | qweqweq | xczxsdf |
|-----------------------------------|
| 2 | prwersd | xzcsdfw | qwefkgs |
-------------------------------------
如果今天的 XML 文件生成以下 DataTable
-------------------------------------
| Key | Column1 | Column2 | Column3 |
|-----------------------------------|
| 0 | sesdfsd | hjghjgh | edrgffb |
|-----------------------------------|
| 1 | wrwerwr | zxcxfsd | pijghjh |
|-----------------------------------|
| 2 | vcbcvbv | vbnvnbn | bnvfgnf |
-------------------------------------
然后当我使用SqlBulkCopy 将新数据导入数据库时,就会出现重复键。我对此的解决方案是使用DateTime.Now.Ticks 生成唯一密钥。从理论上讲,这应该始终创建一个唯一的密钥。
但是,由于某种原因,DateTime.Now.Ticks 并不是唯一的。例如,一行中的 5 条记录可能都具有键 635387859864435908,接下来的 7 条记录可能具有键 635387859864592164,即使我在不同时间生成该值。我想说问题的原因是我的脚本在更新时间之前多次调用DateTime.Now.Ticks。
其他人能想出更好的方法来生成密钥吗?
【问题讨论】:
-
您是否有理由不能只使用 GUID?
-
DateTime.Now.Ticks并不是唯一的。正如您所发现的,处理器在 tick 中可以完成的工作量实际上相当多。 -
@ChrisHaas 我还没有听说过 GUID。我现在正在研究它们,看看这是否能解决问题
-
查看Eric Lippert's关于 GUID 的三部分文章了解更多信息。
-
只是一个警告,如果您使用 GUID 作为主键并将其作为聚集索引(这是默认设置),则可能会出现性能问题,具体取决于您拥有的记录数。当我有 GUID PK 时,我通常会选择不同的列或一组列进行聚类。
标签: c# sql sql-server xml