减少主键数量

时间:2017-06-19 19:01:24

标签: c# csv datatable primary-key

我正在开发一个项目,该项目从每天发布两次的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列的组合是唯一的。各列本身并不是唯一的。只有列的组合。

2 个答案:

答案 0 :(得分:1)

对我而言,这不是主键。主键不是唯一独特的东西'在你的行。唯一索引可以为您做同样的事情。

主键(在我看来)应该只是一个(通常)数值,技术上表示数据是唯一的。 在功能上其他东西可以将行定义为唯一,就像您在此处的示例中所做的那样,但我不会仅仅因为这个原因而将其作为主键。

答案 1 :(得分:0)

复合索引没有错。这就是关系数据库的工作原理,但是如果你真的必须将你构建唯一密钥的8个值连接或散列到一个列中,但这会产生不利影响您的数据是静态的,除非您重建哈希/连接索引。