在程序中,我们是否应该使用try catch来检查表中是否存在重复值,或者我们应该检查表中是否已存在该值并避免插入?
答案 0 :(得分:2)
这很容易在数据库端使用UNIQUE约束强制执行,这是我的建议。我尝试将尽可能多的数据完整性放入数据库中,这样我就可以避免出现不良数据(尽管有时候是不可避免的)。
如果这就是你已经拥有它的方式,你可能只是抓住mysql异常,在这样的表上进行重复值插入,然后进行检查,然后插入成本更高,然后让数据库进行一次简单的查找(可能还有一个插入)。
答案 1 :(得分:1)
取决于您是插入一个还是一百万个,以及副本是否是主键。
如果是主键,请阅读:http://database-programmer.blogspot.com/2009/06/approaches-to-upsert.html
UPSERT或ON DUPLICATE KEY ... UPSERT背后的想法很简单。 客户端发出INSERT命令。如果一行已存在 给定主键,然后而不是抛出键冲突错误,它 获取非键值并更新行。
这是MySQL的一些奇怪的(也是非常不寻常的)案例 实际上支持你在其他所有方面都找不到的东西 成熟的数据库因此,如果您使用MySQL,则无需执行此操作 有什么特别的东西可以制作UPSERT。您只需添加“ON”一词 DUPLICATE KEY UPDATE“到INSERT语句:
如果它不是主键,并且您只插入一行,那么您仍然可以确保这不会导致失败。
对于你的实际问题,我真的不喜欢将try / catch用于程序流程,但实际上,你必须评估可读性和用户体验(在这种情况下是性能),然后选择你认为的是最好的两者混合。
答案 2 :(得分:0)
您可以为表添加UNIQUE约束。类似
CREATE TABLE IF NOT EXISTS login
(
loginid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
loginname CHAR(20) NOT NULL,
UNIQUE (loginname)
);
这将确保没有两个登录名相同。
答案 3 :(得分:0)
您可以创建一个独特的复合键
ALTER TABLE `TableName` ADD UNIQUE KEY (KeyOne, KeyTwo, ...);
答案 4 :(得分:0)
您只需在表格中创建一个唯一键,以便它不允许再次添加相同的值。
答案 5 :(得分:0)
您应该尝试插入值并捕获异常。在繁忙的系统中,如果检查值是否存在,则可能会在检查时间和插入时间之间插入值。
让数据库完成它的工作,让数据库检查重复的条目。
答案 6 :(得分:0)
数据库是一组业务规则的计算机化表示,DBMS用于将这些业务规则强制实施为约束。在现实世界中,都不能验证数据库中的命题是否属实。例如,如果所讨论的模型是企业的员工,而Employees
表包含两个名为'Jimmy Barnes'的人,那么DBMS(也不是数据库)无法知道一个是否是重复的,是否是真人,需要可靠的来源来确定存在和身份。在上面的示例中,企业的人事部门负责检查公共记录,仔细阅读参考资料,确保人员尚未在工资单上等,然后分配可用作密钥的唯一员工参考编号。这就是为什么我们寻找具有可靠来源的行业标准标识符:书籍的ISBN,汽车的VIN,货币的ISO 4217,国家的ISO 3166等。
答案 7 :(得分:-1)
我认为最好检查该值是否已存在并避免插入。可以在保存数据的过程中检查重复值(如果数据库是SQL数据库,则使用exists)。
如果存在重复项,您可以避免插入,并可以向您的应用返回一个值,指示如此,然后相应地显示一条消息。
例如,一段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
重复值的条件取决于您定义为重复记录的内容。在您的应用程序中,您将使用返回值来了解数据是否重复。祝你好运!