2011-11-16 28 views
0

在一个程序中,我们应该使用try catch来检查表中重复值的插入,还是应该检查表中是否存在该值,并避免插入?如何处理数据库中的重复项?

+0

在现实世界中,您经常需要预先验证事物像这样在你的应用程序击中数据库之前。例如,如果你有一个Web UI,你可能需要做简单的表单验证。 – seand

+0

例外有性能损失。尝试和避免例外通常更高效。只有发生异常时,您才会在声明try catch块时承担任何费用。如果您的程序正在执行大量插入,则使用异常捕获时性能可能会成为问题。 –

回答

2

这很容易在数据库端实施UNIQUE约束,这是我的建议。我尝试将尽可能多的数据完整性放入数据库,这样我就可以避免出现错误的数据(尽管有时不可避免)。

如果这就是你已经拥有它的方法,那么你可能只需要捕获mysql异常,以便在检查这样的表时重复插入值,然后插入代价更高,然后让数据库执行一次简单的查找(并且可能插入物)。

0

您可以添加UNIQUE约束你的表..喜欢的东西

CREATE TABLE IF NOT EXISTS login 
(
    loginid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    loginname CHAR(20) NOT NULL, 
    UNIQUE (loginname) 
); 

这将确保不会有两个登录名是相同的。

0

,你可以创建一个独特的复合键

ALTER TABLE `TableName` ADD UNIQUE KEY (KeyOne, KeyTwo, ...); 
0

你只需要建立在你的表中的唯一键,以便将不允许再次添加相同的值。

0

您应该尝试插入值并捕获异常。在繁忙的系统中,如果您检查值的存在性,它可能会在您检查的时间和插入时间之间插入。

让数据库做它的工作,让数据库检查重复条目。

-1

我认为最好检查一下值是否已经存在并避免插入。检查重复值可以在保存数据的过程中完成(如果数据库是SQL数据库,则使用存在)。

如果存在重复项,您可以避免插入,并可以将值返回给您的应用程序,以指示如此,然后相应地显示消息。

例如,一块SQL代码可能是这样的:

select @ret_val = 0 
    If exists (select * from employee where last_name = @param_ln and first_name = @param_fn) 
     select @ret_val = -1 
    Else 
     -- your insert statement here 

    Select @ret_val 

你的条件重复的值取决于你定义为一个重复的记录。在您的应用程序中,您将使用返回值来了解数据是否重复。祝你好运!

1

取决于您是插入一个还是一百万个,以及重复是否是主键。

如果它的主键,阅读:http://database-programmer.blogspot.com/2009/06/approaches-to-upsert.html

的UPSERT或对重复KEY ...的UPSERT背后的想法很简单。 客户端发出INSERT命令。如果一行已经存在 给定的主键,那么 将取代非键值并更新该行,而不是抛出键违例错误。

这是奇怪的(也是非常不寻常的)情况之一,其中MySQL 实际上支持在其他所有其他更多 成熟数据库中找不到的东西。所以如果你使用的是MySQL,你不需要做任何特别的事情来制作UPSERT。你刚才术语“ON DUPLICATE KEY UPDATE”添加到INSERT语句:

如果它不是主键,你将只有一行,那么你仍然可以确保这不会导致失败。

对于您的实际问题,我并不喜欢使用try/catch作为程序流的想法,但实际上,您必须评估可读性和用户体验(在这种情况下的性能),并选择您认为的两者的最佳组合。

0

数据库是一组业务规则的计算机化表示,DBMS用于强制执行这些业务规则作为约束。既不能验证数据库中的命题在现实世界中是否属实。例如,如果所讨论的模型是企业的员工,并且表中包含名为'Jimmy Barnes'的DBMS(也不是数据库)的两个人无法知道其是否是重复的,无论是否是真实的人等等。受信任的来源是需要确定存在和身份。在上面的例子中,企业的人事部门负责检查公共记录,仔细阅读参考资料,确保该人员不在工资单上等,然后分配一个可用作关键字的唯一员工参考编号。这就是我们寻找具有可信来源的行业标准标识符的原因:书籍的ISBN,汽车的VIN,ISO 4217的货币,ISO 3166的国家等。