我需要应用支票,以便用户无法使用数据库中已存在的电子邮件ID进行注册。
答案 0 :(得分:9)
在电子邮件列上设置约束,或在插入前选择。
答案 1 :(得分:3)
确实基本上有两种方法可以达到这个目的:
在插入之前测试记录是否存在,在同一事务中。 ResultSet#next()
的{{1}}应该返回SELECT
。然后执行false
。
无论如何都要INSERT
确定INSERT
中任何被捕获SQLException
的{{3}}是否以23
开头SQLException
是SQLException#getSQLState()
。它可能是由比“仅仅”约束违规更多的因素引起的。您应该不会将每个public static boolean isConstraintViolation(SQLException e) {
return e.getSQLState().startsWith("23");
}
作为约束违规处理。
BIGINT UNSIGNED AUTO_INCREMENT
我会选择第一种方式,因为它在语义上更正确。事实上,这并非特殊情况。你知道它可能会发生。但是,在交易不同步(无意识或优化性能)的繁重并发环境中,它可能会失败。然后,您可能希望确定异常。
也就是说,您通常不希望在电子邮件字段中放置PK。它们可能会发生变化。而是使用DB管理的自动生成的PK(MySQL:SERIAL
,Oracle / PostgreSQL:IDENTITY
,SQLServer:UNIQUE
)并为电子邮件字段提供{{1}}密钥。
答案 2 :(得分:1)
在数据库表的相关列上放置一个唯一约束。例如(MySQL):
ALTER TABLE Users ADD UNIQUE (Email)
编辑 - 如果您在上面的评论中写入时电子邮件字段已经是主键,那么您不需要这样做,因为主键根据定义是唯一的。然后在Java中,如果你插入一个已经存在主键的记录,你可以捕获你获得的SQLException
,或者你可以在尝试插入之前执行SELECT ... WHERE Email=?
以查看是否存在已经是该电子邮件地址的记录。
答案 3 :(得分:1)
可能就像这个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;
}
}
答案 4 :(得分:0)
你可以:
或