Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查数据库中的重复条目?_Java_Database_Jdbc - Fatal编程技术网

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

Java 如何检查数据库中的重复条目?,java,database,jdbc,Java,Database,Jdbc,我需要应用检查,以便用户无法使用数据库中已存在的电子邮件id进行注册。对数据库表中的相关列设置唯一约束。例如(MySQL): 编辑-如果在上面的注释中,电子邮件字段已经是主键,则不需要此字段,因为主键根据定义是唯一的。然后,在Java中,如果插入一个主键已经存在的记录,或者您可以执行一个SELECT。。。其中Email=?在您尝试插入之前,查看是否已经有该电子邮件地址的记录。在电子邮件列上设置一个约束,或在插入之前选择。可能类似于此DAO方法: public boolean isDuplicat

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

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


编辑-如果在上面的注释中,电子邮件字段已经是主键,则不需要此字段,因为主键根据定义是唯一的。然后,在Java中,如果插入一个主键已经存在的记录,或者您可以执行一个
SELECT。。。其中Email=?
在您尝试插入之前,查看是否已经有该电子邮件地址的记录。

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

可能类似于此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;
        }
    }
你可以:

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

  • 在每次插入之前进行选择

实现这一目标基本上有两种方法:

  • 在插入前测试同一事务中是否存在记录。
    SELECT
    ResultSet#next()
    应返回
    false
    。然后执行插入操作

  • 只需执行
    INSERT
    操作,并确定任何捕获的
    SQLException
    是否以
    23
    开头,根据。也就是说,它可能是由比“仅仅”违反约束更多的因素造成的。您不应该将每个
    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
    ),并为电子邮件字段提供一个
    唯一的
    键。

    不清楚:您是用Java连接到MySQL的吗?只需在数据库中选择该电子邮件,看看它是否在。你可能想知道你使用的是什么数据库等等。是的,我正在使用我的sql数据库。我已经将emailid设置为主键+1-“或在插入之前选择”。。。在同一笔交易中+1-尽可能(或实际)在数据库级别强制执行数据约束。我建议将session.close()放在finally块中。这并不是一个很大的问题,但这是一个经典的例子,在我看来,您希望使用finally块。@tkeE2036您是对的,@bhavna raghuvanshi您应该将它放在DAO类所在的位置。我希望第二个可以避免对数据库的两次调用。同意你关于电子邮件领域的看法。不是一个很好的主键候选者。@HLGEM:对索引字段的查询很便宜。创建异常代价高昂。我不确定。在微优化之前配置文件,或者根本不进行微优化;)异常应该很少命中,所以它可能会更昂贵,一次命中数据库,二次命中,每次插入都会发生。因此,从长远来看,它将更加昂贵。但是当你面对多重选择时,你是对的,这是一个好主意。
    public static boolean isConstraintViolation(SQLException e) {
        return e.getSQLState().startsWith("23");
    }