我正在开发一个项目,该项目从每天发布两次的CSV文件中读取信息,并将信息存储到数据库中。每个CSV文件可能包含以前文件中的行。遗憾的是,要在CSV文件中获取唯一行,您必须指定8列作为主键。我觉得这很荒谬。所以,我真的想把数字减少到一个。到目前为止,我唯一的想法是创建所有主键列的哈希,或者只是将它们全部附加到一个字符串中。在我这样做之前,我想知道是否有更好的方法可以将8个主键减少到1个。
PK列定义为:
// ....
table.Columns.Add("plantNumber",typeof(string)); //e.g. 341
table.Columns.Add("shipLocation",typeof(string)); //e.g. 11000047
table.Columns.Add("shipDate",typeof(DateTime)); //e.g. 2017/04/18 00:00
table.Columns.Add("releaseNumber",typeof(string)); //e.g. VH6516128
table.Columns.Add("releaseDate",typeof(DateTime)); //e.g. 2017/04/14
table.Columns.Add("orderNumber",typeof(string)); //e.g. 216967
table.Columns.Add("orderLine",typeof(string)); //e.g. 0011
table.Columns.Add("sequence",typeof(string)); //e.g. 044
// ....
table.PrimaryKey = new DataColumn[]
{
table.Columns["plantNumber"],
table.Columns["shipLocation"],
table.Columns["shipDate"],
table.Columns["releaseDate"],
table.Columns["releaseNumber"],
table.Columns["orderNumber"],
table.Columns["orderLine"],
table.Columns["sequence"],
};
注意:许多看似数字字段被视为string
而不是int
的原因是因为它们在CSV文件中引用,并且可能以我需要的零开头保存。我也不知道100%肯定他们不会包含信件。
更新
我不认为自动增量数是一个好的解决方案,因为我仍然需要确保不仅在SQL DB中,而且在DataTable本身内,8列的组合是唯一的。各列本身并不是唯一的。只有列的组合。
答案 0 :(得分:1)
对我而言,这不是主键。主键不是唯一独特的东西'在你的行。唯一索引可以为您做同样的事情。
主键(在我看来)应该只是一个(通常)数值,技术上表示数据是唯一的。 在功能上其他东西可以将行定义为唯一,就像您在此处的示例中所做的那样,但我不会仅仅因为这个原因而将其作为主键。
答案 1 :(得分:0)
复合索引没有错。这就是关系数据库的工作原理,但是如果你真的必须将你构建唯一密钥的8个值连接或散列到一个列中,但这会产生不利影响您的数据是静态的,除非您重建哈希/连接索引。