如何检查数据库中的重复条目?

时间:2010-06-23 13:04:29

标签: java database jdbc

我需要应用支票,以便用户无法使用数据库中已存在的电子邮件ID进行注册。

5 个答案:

答案 0 :(得分:9)

在电子邮件列上设置约束,或在插入前选择。

答案 1 :(得分:3)

确实基本上有两种方法可以达到这个目的:

  1. 在插入之前测试记录是否存在,在同一事务中。 ResultSet#next()的{​​{1}}应该返回SELECT。然后执行false

  2. 无论如何都要INSERT确定INSERT中任何被捕获SQLException的{​​{3}}是否以23开头SQLExceptionSQLException#getSQLState() 。它可能是由比“仅仅”约束违规更多的因素引起的。您应该不会将每个public static boolean isConstraintViolation(SQLException e) { return e.getSQLState().startsWith("23"); } 作为约束违规处理。

    BIGINT UNSIGNED AUTO_INCREMENT
  3. 我会选择第一种方式,因为它在语义上更正确。事实上,这并非特殊情况。你知道它可能会发生。但是,在交易同步(无意识或优化性能)的繁重并发环境中,它可能会失败。然后,您可能希望确定异常。


    也就是说,您通常不希望在电子邮件字段中放置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)

你可以:

  • 使电子邮件字段唯一,尝试插入并捕获异常

  • 在每次插入前进行选择