我正在创建一个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?谢谢你的帮助!
答案 0 :(得分:2)
如果您希望DutyName
和volNric
具有唯一值,请使用唯一约束/索引执行此操作:
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)
可以选择
在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