簡體   English   中英

插入之前檢查數據庫中是否存在重復項

[英]Check for duplicates in database before inserting

在插入表之前,我需要在數據庫中檢查記錄是否已經存在。 我有兩個表,一個表插入數據,另一個表引用主表。 在此日志表中,我具有ID,date_import和file_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;

我可能誤解了您的問題,但是如果您發送

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);

您正在艱難地做到這一點。 大多數數據庫都有防止重復條目的能力(盡管我對mySQL並不特別了解)。 假設您的RDBMS支持它,只需為有問題的列設置“唯一鍵”,然后讓數據庫為您進行重復檢測。 用您自己的代碼來完成代碼只是過度設計和冗余。

如果您的RDMS 支持這種基本功能,那么該考慮升級了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM