Skip to content
Advertisement

Integrity constraint violation: unique constraint or index violation HSQLDB

For example if I add new Department(new BigInteger("50"), "ODD", "SPB"), all work, it values are insert into database. But if I want again insert for example new Department(new BigInteger("50"), "ODDMOD", "SPBMOD"), appear java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10092 table: DEPARTMENT. I know that can not insert values with the same primary key, but how can update values if primary key exists or other solutions?

 public Department save(Department department) throws SQLException {
    
            Connection connection = ConnectionSource.instance().createConnection();
            String sql = "insert into department values (?, ?, ?)";
            PreparedStatement statement = connection.prepareStatement(sql);
    
            statement.setLong(1, Long.parseLong(String.valueOf(department.getId())));
            statement.setString(2, department.getName());
            statement.setString(3, department.getLocation());
                    statement.executeUpdate();
            PreparedStatement st = connection.prepareStatement("select * from department where id = ? ");
            st.setLong(1, Long.parseLong(String.valueOf(department.getId())));
            ResultSet resultSet = st.executeQuery();
            resultSet.next();
            Department demper = new Department(
                    new BigInteger(String.valueOf(resultSet.getInt("id"))),
                    resultSet.getString("name"),
                    resultSet.getString("location")
            );
            return demper;
        }

Advertisement

Answer

You want an upsert here:

public Department save(Department department) throws SQLException {
    Connection connection = ConnectionSource.instance().createConnection();
    String sql = "MERGE INTO department d1 " +
                 "USING (VALUES ?, ?, ?) d2 (id, name, location) " +
                 "    ON (d1.id = d2.id) " +
                 " WHEN MATCHED THEN UPDATE SET " +
                 " d1.name = d2.name, d1.location = d2.location " +
                 " WHEN NOT MATCHED THEN INSERT (id, name, location) VALUES (d2.id, d2.name, d2.location)";
    PreparedStatement statement = connection.prepareStatement(sql);

    // execute merge here as before

    statement.setLong(1, Long.parseLong(String.valueOf(department.getId())));
    statement.setString(2, department.getName());
    statement.setString(3, department.getLocation());
    statement.executeUpdate();

    // ...
}

A MERGE behaves by doing an insert if the department id does not already exist in the table. Otherwise it will do an update. Note that if you shift to JPA/Hibernate from pure JDBC, the JPA save() method can upsert automatically for you under the hood.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement