【问题标题】:Dataset - duplicate values when setting primary key数据集 - 设置主键时重复值
【发布时间】:2009-11-23 14:25:11
【问题描述】:

我有一个包含“person_code”列的数据集。

此列包含以下数据:

  • “卡拉”
  • “Carra” -> 一个尾随空格

现在,如果我将数据集的主键设置为“person_code”列,我将收到以下错误:

“这些列目前没有唯一值。”

有什么办法吗?我能想到的最好的方法是添加一个新列“primary_key”,然后用另一个符号替换结束/开始空格。这将导致一些额外的问题:如果我将它们替换为 _ 并且数据库中已经存在 Carra_...

有没有更好的办法?

【问题讨论】:

  • 为什么要在主键列中允许尾随空格?我知道“Carra”和“Carra”是不同的值是完全正确的,但它充其量只会造成混淆。
  • 好吧,我们的应用程序剥离了代码。第三方应用程序不会剥离它们。所以我们被他们困住了。
  • FWIW,我也有同样的情况。我在其中一行中继承了具有相同尾随空格模式的数据,并且我认为 DataSet.PrimaryKey 抛出此异常是一个错误,当 SQL Server 接受此数据作为主键列有效时,创建记录时.如果这是一个问题,那么它应该被标记出来。
  • 实际上,该表没有将列设置为主键,所以这可能是 SQL Server 接受此示例的“Carra”和“Carra”的等效项的原因。只有我的代码在这个列上设置了 DataSet.PrimaryKey,所以当然不能保证数据真的是唯一的。

标签: c# .net dataset


【解决方案1】:

这是一个数据库架构问题,您的问题的答案是,正如您所描述的,person_code 列不适合作为主键,因为它的值不是唯一的。

您的主键应该是 100% 唯一的 - 通常增量生成的数字是一个合适的选择。

【讨论】:

  • 这些值 100% 唯一的。它们在数据库中确实有一个独特的约束。
【解决方案2】:

主键总是唯一的,所以如果两个人有相同的人代码,那么这确实会导致这个问题

现在,它们似乎并不完全相同(正如您所说的那样有一个尾随空格。我的猜测是您的代码默认情况下可能会删除尾随空格。您可能希望在开头和开头放置一个符号最后,像 'Carra' 和 'Carra' 让它们与众不同。

您可能需要定义另一个符号。尝试一种您知道永远不会出现在您的数据中的方法。

【讨论】:

    【解决方案3】:

    为您的问题和数据库的长期维护建议的解决方案是创建一个新的主键字段,最好使用 int 或 uniqueidentifier 作为数据类型。

    一般来说,值中的尾随空格是个坏主意。无论是从 UI 的角度来看,还是从数据完整性的角度来看。您可以考虑清理数据、去除数据中的前导和尾随空格、特殊字符等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2019-03-31
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多