在一个程序中,我们应该使用try catch来检查表中重复值的插入,还是应该检查表中是否存在该值,并避免插入?如何处理数据库中的重复项?
回答
这很容易在数据库端实施UNIQUE约束,这是我的建议。我尝试将尽可能多的数据完整性放入数据库,这样我就可以避免出现错误的数据(尽管有时不可避免)。
如果这就是你已经拥有它的方法,那么你可能只需要捕获mysql异常,以便在检查这样的表时重复插入值,然后插入代价更高,然后让数据库执行一次简单的查找(并且可能插入物)。
您可以添加UNIQUE约束你的表..喜欢的东西
CREATE TABLE IF NOT EXISTS login
(
loginid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
loginname CHAR(20) NOT NULL,
UNIQUE (loginname)
);
这将确保不会有两个登录名是相同的。
,你可以创建一个独特的复合键
ALTER TABLE `TableName` ADD UNIQUE KEY (KeyOne, KeyTwo, ...);
你只需要建立在你的表中的唯一键,以便将不允许再次添加相同的值。
您应该尝试插入值并捕获异常。在繁忙的系统中,如果您检查值的存在性,它可能会在您检查的时间和插入时间之间插入。
让数据库做它的工作,让数据库检查重复条目。
我认为最好检查一下值是否已经存在并避免插入。检查重复值可以在保存数据的过程中完成(如果数据库是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
你的条件重复的值取决于你定义为一个重复的记录。在您的应用程序中,您将使用返回值来了解数据是否重复。祝你好运!
取决于您是插入一个还是一百万个,以及重复是否是主键。
如果它的主键,阅读: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作为程序流的想法,但实际上,您必须评估可读性和用户体验(在这种情况下的性能),并选择您认为的两者的最佳组合。
数据库是一组业务规则的计算机化表示,DBMS用于强制执行这些业务规则作为约束。既不能验证数据库中的命题在现实世界中是否属实。例如,如果所讨论的模型是企业的员工,并且表中包含名为'Jimmy Barnes'的DBMS(也不是数据库)的两个人无法知道其是否是重复的,无论是否是真实的人等等。受信任的来源是需要确定存在和身份。在上面的例子中,企业的人事部门负责检查公共记录,仔细阅读参考资料,确保该人员不在工资单上等,然后分配一个可用作关键字的唯一员工参考编号。这就是我们寻找具有可信来源的行业标准标识符的原因:书籍的ISBN,汽车的VIN,ISO 4217的货币,ISO 3166的国家等。
- 1. 处理数据仓库中的重复项
- 2. 处理重复的数据库条目
- 3. 如何处理scrapy中的重复项?
- 4. 如何处理单个列数据库中的重复条目?
- 5. geom_tile()如何处理重复的数据?
- 6. 处理SSRS参数中的重复项
- 7. 处理MPEG2-TS中的重复数据
- 8. 在.NET中正确处理数据库中的重复行
- 9. 防止数据库中的重复项
- 10. 处理数据仓库加载中的主键重复
- 11. pentaho的复制块如何处理重复数据?
- 12. 如何处理重复的参数?
- 13. 如何在Android的选项卡活动中处理数据库
- 14. Android如何检查我的sqlite数据库中的重复项?
- 15. php - laravel:如何处理数据库中的时间重叠?
- 16. 从数据库中删除重复项
- 17. 如何在c中处理数据库#
- 18. 如何处理github托管项目上的数据库凭据?
- 19. 如何删除MS SQL数据库中的部分重复项?
- 20. 修复数据库重复项(MySQL bug)
- 21. 如何处理SQL中的重复行?
- 22. ImageList.ImageCollection如何处理重复?
- 23. 如何处理断开的对象图中的重复项?
- 24. 如何处理Ember商店中可能的重复项?
- 25. 如何处理重复数据的抓取?
- 26. 如何从数据库中删除重复项?
- 27. 如何在数据库中查找重复项?
- 28. 如何将数据库中的数据处理成数组?
- 29. 过滤批处理参数数组中的重复项
- 30. 在SQL Server中如何处理重复
在现实世界中,您经常需要预先验证事物像这样在你的应用程序击中数据库之前。例如,如果你有一个Web UI,你可能需要做简单的表单验证。 – seand
例外有性能损失。尝试和避免例外通常更高效。只有发生异常时,您才会在声明try catch块时承担任何费用。如果您的程序正在执行大量插入,则使用异常捕获时性能可能会成为问题。 –