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