如何检查数据库中的重复条目?
大概是这样的DAO方法:
public boolean isDuplicateEntry(String email) {
Session session = getSession();
try {
User user = (User) session.get(User.class, email);
session.close();
return (null != user);
} catch (RuntimeException e) {
log.error("get failed", e);
session.close();
throw e;
}
}
我会建议把session.close()放在finally块中。这并不是一个巨大的交易,但这是一个经典的例子,你可能想在我看来使用finally块。 – 2010-06-23 13:14:37
我应该在哪里放这个代码? – 2010-06-23 13:18:52
@ tkeE2036你是对的,@bhavna raghuvanshi你应该把它放在您的DAO类 – ant 2010-06-23 13:40:09
在数据库表中的相关列上添加一个唯一约束。例如(MySQL的):
ALTER TABLE Users ADD UNIQUE (Email)
编辑 - 如果你在上面评论写电子邮件领域已经是一个主键,那么你不需要这个,因为主键被定义独特。然后在Java中,您可以捕获您获得的SQLException
,如果您要插入带有已存在主键的记录,或者您可以在尝试插入之前执行SELECT ... WHERE Email=?
以查看是否已有包含该电子邮件的记录地址。
在电子邮件列上添加约束,或在插入前选择。
+1 - *“或插入前选择” * ...在同一个事务! – 2010-06-23 13:11:40
+1 - 尽可能(或实际)在数据库级别实施数据约束。 – 2010-06-23 13:57:29
您可以:
- 使电子邮件领域独树一帜,尝试插入和捕获异常
或
- ma科每前选择插入
确实有基本上有两种方式来实现这一目标:
测试是否记录插入,同一事务内部存在之前。
SELECT
的ResultSet#next()
应返回false
。然后做INSERT
。-
只是做
INSERT
反正确定的任何SQLException#getSQLState()
逮住SQLException
开始与23
这是一个约束违规按该SQL specification。它可能是由多种因素造成的,而不仅仅是违反约束条件。你应该不处理每个SQLException
作为违反约束。public static boolean isConstraintViolation(SQLException e) { return e.getSQLState().startsWith("23"); }
我会选择第一种方式,因为它在语义上更正确。这实际上并不是一个特殊的情况。你即知道它可能会发生。但它可能潜在地失败,在交易不是同步(无意识地或优化性能)的交易量很大的并发环境中。您可能想要确定异常。
这就是说,你通常不希望把一个PK放在电子邮件字段中。他们即将发生变化。而是使用数据库管理的自动生成的PK(MySQL:BIGINT UNSIGNED AUTO_INCREMENT
,Oracle/PostgreSQL:SERIAL
,SQLServer:IDENTITY
)并给电子邮件字段键入UNIQUE
。
目前还不清楚:你的接口在Java中的MySQL? – Jack 2010-06-23 13:06:16
只需在数据库中选择该电子邮件并查看它是否在英寸。您可能想知道您使用的数据库等等。 – hamax 2010-06-23 13:06:55
是的,我正在使用我的sql数据库。 我也在田间EMAILID作为主键 – 2010-06-23 13:09:51