Java 插入前检查数据库中是否存在重复项

Java 插入前检查数据库中是否存在重复项,java,Java,在我插入到表中之前,我需要在数据库中检查记录是否已经存在。我有两个表,一个用于插入数据,另一个用于引用主表的日志表。在这个日志表中,我有ID、日期和文件导入。所以我想检查文件导入是否已经存在 这是我的草稿代码: //DATE DateFormat dateF = new SimpleDateFormat("dd.MM.yyyy"); Date date = new Date(); //DATE //DB INIT Stri

在我插入到表中之前,我需要在数据库中检查记录是否已经存在。我有两个表,一个用于插入数据,另一个用于引用主表的日志表。在这个日志表中,我有ID、日期和文件导入。所以我想检查文件导入是否已经存在

这是我的草稿代码:

    //DATE
        DateFormat dateF = new SimpleDateFormat("dd.MM.yyyy");
        Date date = new Date();
//DATE        

//DB INIT
        String URL = "jdbc:mysql://192.168.1.128:3306";
        Connection con = (Connection) DriverManager.getConnection(URL,user,pass);
        Statement stmt = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        Statement stmt1 = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        String mySQL_log = ("CREATE TABLE IF NOT EXISTS dbtest.T_AJPES_TR_LOG"
            + "(ID INT unsigned PRIMARY KEY AUTO_INCREMENT, Date_import VARCHAR(45),"
            + "File_import VARCHAR(75)) ENGINE = INNODB");
        String mySQL_new_table = ("CREATE TABLE IF NOT EXISTS dbtest.T_AJPES_TR "
            + "(row_count INT PRIMARY KEY AUTO_INCREMENT,"
            + "rn CHAR(15),sSpre CHAR(5),reg CHAR(5),eno VARCHAR(10),davcna VARCHAR(15),Ime VARCHAR(75),"
            + "Priimek VARCHAR(75),ID_LOG INT unsigned,"
            + "CONSTRAINT FOREIGN KEY(ID_LOG) references T_AJPES_TR_LOG(ID) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = INNODB");

        stmt1.executeUpdate(mySQL_log);
        ResultSet uprs1 = stmt1.executeQuery("SELECT * FROM dbtest.T_AJPES_TR_LOG");
        stmt.executeUpdate(mySQL_new_table);
        ResultSet uprs = stmt.executeQuery("SELECT * FROM dbtest.T_AJPES_TR");
//SELECT INIT

//READ FILE        
        File folder = new File(readFolder);
        String[] fileName = folder.list();

        for (;k<fileName.length;k++) {
            name = fileName[k];
            if (name.contains(".xml")) {
            FileInputStream fstream = new FileInputStream(readFolder + name);
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
//READ FILE
            uprs.next();
            file_exists = uprs1.getString("File_import");

            if (!file_exists.equals(name)) {
                uprs1.afterLast();
                uprs1.moveToInsertRow();
                uprs1.updateString("Date_import",dateF.format(date));
                uprs1.updateString("File_import",name);
                uprs1.insertRow();
                i=0;
//日期
DateFormat dateF=新的简化格式(“dd.MM.yyyy”);
日期=新日期();
//日期
//数据库初始化
String URL=“jdbc:mysql://192.168.1.128:3306";
Connection con=(Connection)DriverManager.getConnection(URL、用户、密码);
语句stmt=(语句)con.createStatement(ResultSet.TYPE\u SCROLL\u敏感,ResultSet.CONCUR\u可更新);
语句stmt1=(语句)con.createStatement(ResultSet.TYPE\u SCROLL\u敏感,ResultSet.CONCUR\u可更新);
字符串mySQL_log=(“如果不存在创建表dbtest.T_AJPES_TR_log”
+(ID INT无符号主键自动递增,日期导入VARCHAR(45)
+“文件_import VARCHAR(75))ENGINE=INNODB”);
字符串mySQL\u new\u table=(“如果不存在,则创建表dbtest.T\u AJPES\u TR”
+(行计数INT主键自动递增,)
+“rn字符(15)、sSpre字符(5)、reg字符(5)、eno VARCHAR(10)、davcna VARCHAR(15)、Ime VARCHAR(75),”
+Priimek VARCHAR(75),ID_LOG INT未签名
+“约束外键(ID_LOG)引用T_AJPES_TR_LOG(ID)ON DELETE CASCADE ON UPDATE CASCADE)ENGINE=INNODB”);
stmt1.executeUpdate(mySQL\u日志);
结果集uprs1=stmt1.executeQuery(“从dbtest.T_AJPES_tru LOG中选择*);
stmt.executeUpdate(mySQL\u new\u表);
ResultSet uprs=stmt.executeQuery(“从dbtest.T_AJPES_TR中选择*);
//选择INIT
//读取文件
文件夹=新文件(readFolder);
字符串[]文件名=文件夹.list();

我可能误解了你的问题,但如果你

SELECT * FROM dbtest.T_AJPES_TR_LOG WHERE file_import='MyFileName.xml';
对于数据库,您将得到一个空的结果集(=实际文件名是新的)或一个包含1..n个条目的集(=文件名已知且已记录1..n次)


引用克努博的话:

String query = String.format(
    "SELECT * FROM dbtest.T_AJPES_TR_LOG WHERE File_import='%s'", name);
uprs1 = stmt1.executeQuery(query);

我可能误解了你的问题,但如果你

SELECT * FROM dbtest.T_AJPES_TR_LOG WHERE file_import='MyFileName.xml';
对于数据库,您将得到一个空的结果集(=实际文件名是新的)或一个包含1..n个条目的集(=文件名已知且已记录1..n次)


引用克努博的话:

String query = String.format(
    "SELECT * FROM dbtest.T_AJPES_TR_LOG WHERE File_import='%s'", name);
uprs1 = stmt1.executeQuery(query);

这是很难做到的。大多数数据库都有防止重复条目的能力(尽管我不太熟悉mySQL)。假设您的RDBMS支持它,只需为列设置“唯一键”有问题的是,让数据库为您执行重复检测(&L)。在您自己的代码中执行重复检测简直是过度工程化和冗余


如果你的RDMS <强>不< /强>支持这样一个基本特征,现在是考虑升级的时候了。

你这么做是很困难的。大多数数据库都有能力防止重复的条目(虽然我不太熟悉MySQL)。假设你的RDBMS支持它,只需为列设置“唯一密钥”。有问题的是,让数据库为您执行重复检测(&L)。在您自己的代码中执行重复检测简直是过度工程化和冗余


如果你的RDMS <强>不< /强>支持这样一个基本特征,现在是考虑升级的时候了。

看起来你所发布的代码是不完整的。为什么不将列定义为唯一的键,那么数据库将管理它自己?如果在该键列中已经存在相同值的记录,它将拒绝任何插入记录。s、 我只发布了部分代码。由于这是我进行选择的部分,所以这也是唯一的XML解析部分。问题是如何防止该程序不再从同一文件导入数据?看起来您发布的代码不完整。为什么不将列定义为唯一键,以便数据库自行管理?它将拒绝任何ins记录的插入如果该键列中已经存在具有相同值的记录,则我只发布了部分代码。由于这是我进行选择的部分,所以这只是XML解析部分。问题是如何防止该程序不再从同一文件导入数据?我尝试了这种方法,但出现了一些错误?这是我以前编写的方法re uprs1.afterLast():uprs1=stmt1.executeQuery(“SELECT*FROM dbtest.T_AJPES_TR_LOG WHERE File_import=“+name”);您必须将名称放在引号中,或者更好地使用准备好的语句。“”我在尝试这种方法时遇到此错误:线程“main”中出现异常”com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:where子句中的未知列“RTR_AJPES_20101027_POS_S_D.xml”Andreas,谢谢您的回答。我尝试了您的代码,但当我尝试运行时,我得到了以下错误:线程“main”中的异常com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:key“File\u import”的重复条目“RTR\u AJPES\u 20101027\u POS\u S\u D.xml”。我想我应该以某种方式检查if语句是否已导入?我尝试了这种方法,但出现了一些错误?这是我在uprs1之前编写的方式。afterLast():uprs1=stmt1.executeQuery(“从dbtest.T_AJPES_TR_LOG WHERE File_import=“+name”)中选择*;您必须将名称加引号,或者更好地使用准备好的语句。”“我尝试这种方法时出现此错误:线程中的异常”main“com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:where子句中的未知列'RTR_AJPES_20101027_POS_S_D.xml',Andreas,谢谢您的回答。我尝试了您的代码,但当我尝试运行时,我得到了以下错误:线程“main”中的异常”com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:key“File\u import”的重复条目“RTR\u AJPES\u 20101027\u POS\u S\u D.xml”。我想我应该用if语句检查它是否被导入了?谢谢你的回答。我尝试将File\u import设置为唯一键,但如果我尝试导入同一个文件两次,Java会抛出“replicate e”