verificar datos duplicates antes de insert

Estoy creando un progtwig java swing donde los usuarios pueden crear un logging, pero quiero poder verificar si hay duplicates antes de permitir que los usuarios creen el logging. Aquí está mi código:

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

por el cual los usuarios no pueden crear el logging si ya existe una fila con el mismo deberNombre y volNric. Si tuviera que ejecutar esta línea de instrucción sql

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

¿Lo implementaría en mySQL (solo una vez, incluso si trunco ​​mis datos) o en mis códigos de progtwig? (Estoy usando eclipse) También estoy usando una architecture de tres niveles 🙂 Finalmente, ¿cómo implementaría el código para mostrar JOptionPane si ya se ha detectado un logging duplicado? ¡Gracias por tu ayuda!

Si desea que DutyName y volNric tengan valores únicos, hágalo con una restricción / índice único:

 create index idx_assignrequests_dutyname_volnric on assignrequests(dutyname, volnric); 

Luego, cuando hagas la insert , puedes dejar que falle. O bien, puede ignorarlo utilizando la on duplicate key update :

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

La columna que se actualiza se establece a sí misma, por lo que la operación no hace nada.

Estoy completamente de acuerdo con la respuesta @ hd1 que necesita para aplicar esta condición para la consulta después de crear la restricción única.

Debe crear una restricción única primero en cualquiera de sus columnas que necesite como columna única.

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

Hay una opción para

  • INSERT IGNORE ("SI NO EXISTE")
  • INSERTAR EN ACTUALIZACIÓN CLAVE DUPLICADA

En CREATE TABLE debe haber una restricción, key única en los campos únicos. De lo contrario ALTER TABLE.

Dejo que usted haga una elección e inspeccione la documentation de reference de MySQL.

Supongo que se reqId una key primaria AUTOINCREMENT.

En el INSERT, omitirlo, para ser generado por la database, para no tener problemas de simultaneidad, de dos personas al mismo time obteniendo un nuevo requerimiento.

Además, use PrepanetworkingStatement; esto es realmente casi obligatorio, ya que escapa el apóstrofo y las barras diagonales inversas; evita la inyección SQL, se ve mejor.

 try (PrepanetworkingStatement 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