是否可以轻松检测或预测SQL中的主键冲突?

时间:2009-06-11 10:31:26

标签: sql sql-server database primary-key

我的问题是我想运行一个查询来检查我使用的数据是否与数据库中已有的数据重复,例如我有一个产品代码,并希望停止多次列出相同的项目,此产品代码是主键 我可以避免这样做:

SELECT ProductCode FROM tblProducts WHERE ProductCode = '12345'

然后检查任何返回的记录,或者是否有一个更优雅的解决方案,我不介意使用这种方法,但它看起来很笨拙。这只是对我的代码的一些额外验证,因为产品的插入应该只发生一次 - 但我想要对此进行错误检查,因为由于刷新或使用后退按钮(基于Web的系统)而输入了重复项。

不知道这是P = NP型问题,还是我在思考问题? 如果有帮助,我的数据库是MS SQL Server 2000。

5 个答案:

答案 0 :(得分:7)

我建议只是让SQL插入失败并让SQL Server通过主键冲突错误并处理它。 SQL Server维护一个索引,他们已经做了多年。我很确定他们的实现将比大多数开发人员好很多倍。如果您正在尝试为此编程,则需要读入所有键并将它们保存在某个索引中。 SQL Server已经这样做了。因此,您需要进行双重检查,并将所需空间增加一倍。

如果由于某些原因导致与数据库的连接速度非常慢,我会考虑这样做。

否则让SQL Server做好它的事情,然后你做其余的事情:)

答案 1 :(得分:2)

在插入

之前,只需允许SQL先测试
IF NOT EXISTS (SELECT * FROM tblProducts WHERE tblProducts = '12345')
    INSERT tblProducts (tblProducts, columnlist, ...)
    VALUES ('12345', valuelist, ...)

这更好地包装在存储过程中,因此它自包含在数据库中(但是每个人都有自己的视图)。

答案 2 :(得分:1)

如果在那里进行提取,你可以按列进行分组,如果它在那里重复,你只能得到一行。如果要返回多个列,则只返回要返回的所有列。

答案 3 :(得分:0)

我想这取决于这种情况发生的频率。

如果极少发生,我会抓住违规的可能性,如果发生违规,请相应地通知用户。

如果它可能经常发生,我可能会首先检查我的新项目是否正常,并且只有在插入时实际上是这样。另一方面,如果这看起来经常发生,那么你的应用程序逻辑一定有问题,我会说 - 你应该有一种确定的方法来创建和分配唯一的主键(因此永远不会导致插入冲突),例如使用INT IDENTITY列或其他方法。

马克

答案 4 :(得分:0)

也许问题在于您的网络应用程序的设计?您是否只通过http POST确保数据在数据库中发生变异。然后确保那些页面响应的过期时间为零或现在(我不记得它是基于日期还是基于毫秒)。这样,回击的用户将看到“您要重新发布表单数据”消息,或者从浏览器获取“页面已过期”链接。

接下来,任何接受用户输入的页面都需要具有容错能力。您的主键似乎是由您的用户输入的。但是,即使不是,输入唯一键而不是计算数据也是合理的。

处理这种情况的一般策略是什么? (它不是p = np)这个问题面临着许多数据库类型的应用程序。似乎其他海报已经为这个问题提供了一些解决方案。

祝你好运