【发布时间】:2010-06-23 13:04:28
【问题描述】:
我需要进行检查,以便用户无法使用数据库中已存在的电子邮件 ID 进行注册。
【问题讨论】:
-
不清楚:你是用Java接口连接mysql吗?
-
只需在数据库中选择该电子邮件并查看它是否在其中。您可能想知道您使用的数据库等等。
-
是的,我正在使用我的 sql 数据库。我已将 emailid 设置为主键
我需要进行检查,以便用户无法使用数据库中已存在的电子邮件 ID 进行注册。
【问题讨论】:
在电子邮件列上设置约束,或在插入之前选择。
【讨论】:
确实基本上有两种方法可以实现这一点:
在插入之前测试记录是否存在于同一事务中。 SELECT 的 ResultSet#next() 应该返回 false。然后INSERT。
无论如何,只需执行INSERT 并确定任何捕获的SQLException 中的SQLException#getSQLState() 是否以23 开头,根据SQL specification,这是违反约束的。它可能是由更多的因素引起的,而不仅仅是“违反”约束。您不应该将每个SQLException 都视为违反约束。
public static boolean isConstraintViolation(SQLException e) {
return e.getSQLState().startsWith("23");
}
我会选择第一种方式,因为它在语义上更正确。事实上,这并不是一个例外情况。您即知道它可能会发生。但它可能会在事务不同步的繁重并发环境中失败(不知不觉或优化性能)。然后,您可能想要确定异常。
也就是说,您通常不希望将 PK 放在电子邮件字段中。它们即会发生变化。而是使用 DB 管理的自动生成的 PK(MySQL:BIGINT UNSIGNED AUTO_INCREMENT,Oracle/PostgreSQL:SERIAL,SQLServer:IDENTITY)并为电子邮件字段提供 UNIQUE 键。
【讨论】:
大概是这样的 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;
}
}
【讨论】:
对数据库表中的相关列设置唯一约束。例如(MySQL):
ALTER TABLE Users ADD UNIQUE (Email)
edit - 如果电子邮件字段已经是您在上面的评论中写的主键,那么您不需要这个,因为主键根据定义是唯一的。然后在Java中,如果您要插入具有已存在的主键的记录,则可以捕获SQLException,或者您可以在尝试插入之前执行SELECT ... WHERE Email=?以查看是否已经存在记录该电子邮件地址。
【讨论】:
你可以:
或
【讨论】: