2010-12-01 3 views
0

Мне нужно проверить базу данных, если запись уже существует до того, как я вставляю ее в таблицу. У меня есть две таблицы, одна из которых я вставляю данные и одну таблицу журналов, на которые ссылается основная таблица. В этой таблице журналов есть ID, date_import и file_import. Поэтому я хочу проверить, существует ли файл_импорт.Проверьте наличие дубликатов в базе данных перед вставкой

Вот мой скретч код:

//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; 
+0

Похоже, что код, который вы опубликовали, не является полным. – Ralph 2010-12-01 09:23:03

+0

В чем вопрос? – 2010-12-01 09:23:54

+1

Почему бы не определить столбец как уникальный ключ, чтобы база данных справилась сама? Он отклонит любую вставку записи, если запись с тем же значением в этом ключевом столбце уже существует – duduamar 2010-12-01 09:25:51

ответ

2

Может быть, я неправильно понял ваш вопрос, но если вы отправить

SELECT * FROM dbtest.T_AJPES_TR_LOG WHERE file_import='MyFileName.xml'; 

в базу данных, вы либо получите пустой результирующий набор (= фактическое имя файла является новым) или набор с 1..n записями (= имя файла известно и зарегистрировано 1..n раз).


Положите его в кавычки, так как Knubo сказал:

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

Вы делаете это трудный путь. Большинство баз данных имеют возможность предотвратить дублирование записей (хотя я не очень хорошо знаком с mySQL). Предполагая, что ваша RDBMS поддерживает его, просто настройте «уникальный ключ» для рассматриваемого столбца (ов), & позвольте базе данных выполнить двойное обнаружение для вас. Выполнение этого в вашем собственном коде просто избыточно-инженерное & избыточное.

Если у вашего RDMS нет, поддерживайте такую ​​базовую функцию, пришло время рассмотреть обновление.

Смежные вопросы