【问题标题】:how to check for duplicate entries in database?如何检查数据库中的重复条目?
【发布时间】:2010-06-23 13:04:28
【问题描述】:

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

【问题讨论】:

  • 不清楚:你是用Java接口连接mysql吗?
  • 只需在数据库中选择该电子邮件并查看它是否在其中。您可能想知道您使用的数据库等等。
  • 是的,我正在使用我的 sql 数据库。我已将 emailid 设置为主键

标签: java database jdbc


【解决方案1】:

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

【讨论】:

  • +1 - "or select before insert" ...在同一个事务中!
  • +1 - 尽可能(或实际)在数据库级别实施数据约束。
【解决方案2】:

确实基本上有两种方法可以实现这一点:

  1. 在插入之前测试记录是否存在于同一事务中。 SELECTResultSet#next() 应该返回 false。然后INSERT

  2. 无论如何,只需执行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 键。

【讨论】:

  • 我更喜欢第二个以避免两次调用数据库。同意您对电子邮件字段的看法。不适合作为主键。
  • @HLGEM:对索引字段的查询很便宜。创建异常是昂贵的。我不确定。在微优化之前配置文件,或者根本不进行微优化;)
  • 异常应该很少发生,因此它可能会更昂贵,每次插入都会发生一次对数据库的攻击,副两次。因此,从长远来看,它会更贵。但是当您面临多种选择时,您是对的,剖析一下是个好主意。
【解决方案3】:

大概是这样的 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 块。
  • @tkeE2036 你是对的,@bhavna raghuvanshi 你应该把它放在你的 DAO 类所在的地方
【解决方案4】:

对数据库表中的相关列设置唯一约束。例如(MySQL):

ALTER TABLE Users ADD UNIQUE (Email)

edit - 如果电子邮件字段已经是您在上面的评论中写的主键,那么您不需要这个,因为主键根据定义是唯一的。然后在Java中,如果您要插入具有已存在的主键的记录,则可以捕获SQLException,或者您可以在尝试插入之前执行SELECT ... WHERE Email=?以查看是否已经存在记录该电子邮件地址。

【讨论】:

    【解决方案5】:

    你可以:

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

    • 在每次插入前进行选择

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 2014-03-16
      • 2010-09-30
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2017-05-08
      相关资源
      最近更新 更多