【问题标题】:Avoid primary key constraint violation避免违反主键约束
【发布时间】:2023-03-30 12:49:01
【问题描述】:

当用户在对话框中输入一些数据时,我尝试将数据插入到 sqlite 数据库表中。但是我必须检查是否没有违反主键约束。我需要一些提示,告诉用户这条记录已经存在的最佳方式是什么。到目前为止,我认为我有两个选择:

1.) 使用 'select' 和 'where' 查询记录,并尝试找出该记录是否已经存在

2.) 在插入时尝试/捕获并检查错误代码 19,该错误代码说明违反了约束。

遗憾的是,数字 19 绝不仅仅是违反主键约束,而是违反任何约束。我更喜欢第一个选择,但它不是消耗太多性能吗?

为什么不存在关于检查主键是否存在并获取适当记录数据的功能,以便我可以用适当的数据通知用户该记录已经存在。

感谢您对此主题的任何提示。

【问题讨论】:

  • 使用选择。 Try-catch 的目的是处理意外行为。这是一个非常典型的案例。
  • 您可以编写一个存储过程,先进行检查,如果记录不存在则插入,并返回成功或失败代码。
  • 感谢您的提示!
  • 这不应该出现。用户永远不应该看到或知道主键。他们应该知道他们是在添加新的东西还是更新现有的东西。你的应用也应该知道这一点。
  • 是的,我同意。无论如何,具有三个字段的 pk 需要一个具有多个 AND 语句的奇怪 where 子句。复合 pk 定义的语法要容易得多。在用户视图中,我会提示用户这条记录已经存在,他/她可以取消操作o按确定编辑现有记录。

标签: c# sqlite


【解决方案1】:

使用 select - 它甚至比在应用程序级别尝试 catch 更快。

【讨论】:

  • 我将使用选择。但是我建议让在主键上使用 select 变得更容易。就我而言, pk 是三个字段的组合。对于 select 语句,我将不得不使用三个 AND 语句。可以更容易地构造 where primary_key=('val1',2,'val3');这避免了三个 AND 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2012-07-15
  • 2021-04-11
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多