插入前检查重复数据

时间:2014-08-11 14:09:07

标签: java mysql sql swing

我正在创建一个java swing程序,用户可以在其中创建记录,但我希望能够在允许用户创建记录之前检查重复项。这是我的代码:

public boolean createAssignRequest(AssignmentRequests assignReq) {

    int id = assignReq.getReqId();
    String dutyName = assignReq.getDutyName();
    String volNric = assignReq.getVolNric();

    boolean success = false;
    DBController db = new DBController();
    String dbQuery = "";

    db.getConnection();

    dbQuery = "INSERT into assignrequests (dutyName, volNric)"
            + " VALUES ('" + dutyName + "','" + volNric + "')";

    if (db.updateRequest(dbQuery) == 1) {
        success = true;
    }
    db.terminate();

    return success;

}

如果已存在具有相同dutyName和volNric的行,则用户无法创建记录。 如果我要执行这行sql语句

ALTER TABLE `assignrequests` ADD UNIQUE `uniqueindex`(`dutyName`, `volNric`);

我会在mySQL中实现它(即使我截断我的数据也只是一次)或在我的程序代码中实现它? (我使用eclipse) 我也使用三层架构:-) 最后,如果已经检测到重复记录,我将如何实现代码以显示JOptionPane?谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

如果您希望DutyNamevolNric具有唯一值,请使用唯一约束/索引执行此操作:

create index idx_assignrequests_dutyname_volnric on assignrequests(dutyname, volnric);

然后,当你执行insert时,你可以让它失败。或者,您可以使用on duplicate key update忽略它:

INSERT into assignrequests(reqId, dutyName, volNric)"
    VALUES ('" + id + "','" + dutyName + "','" + volNric + "')
    ON DUPLICATE KEY UPDATE dutyName = VALUES(dutyName);

正在更新的列正在设置为自身 - 因此操作不会执行任何操作。

答案 1 :(得分:0)

我完全同意@ hd1答案,您需要在创建唯一约束后为查询应用此条件。

您需要首先为您需要的任何列创建唯一约束作为唯一列。

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        DBMS_OUTPUT.PUT_LINE('This is duplicate Value ')

答案 2 :(得分:0)

可以选择

  • INSERT IGNORE(“IF NOT NOT EXISTS”)
  • INSERT ON DUPLICATE KEY UPDATE

在CREATE TABLE中,必须在唯一字段上有一个约束,唯一键。否则ALTER TABLE。

我留给你做出选择并检查mysql参考文档。

我认为reqId是AUTOINCREMENT主键。

在INSERT中,由数据库生成,为了不出现并发问题,两个人同时获得新的reqId。

此外,使用PreparedStatement;这几乎是强制性的,因为它逃脱了撇号和反斜杠;防止SQL注入,看起来更好。

try (PreparedStatement stm = conn.prepareStatement(
        "INSERT IGNORE INTO assignrequests (dutyName, volNric) VALUES(?, ?)")) {
    stm.setString(1, dutyName);
    stm.setString(2, volNric);
    int updateCount = stm.executeUpdate();
    if (updateCount != 0) {
        try (ResultSet genKeys = stm.getGeneratedKeys()) {
            if (genKeys.next()) { // At most 1 record inserted
                // Normally only one key generated per record.
                int reqId = genKeys.getInt(0);
                ...
            }
        } // Close result set.
    }
} // Closes stm