插入前如何检查?

时间:2018-02-28 06:57:31

标签: java oracle jdbc

我有一个包含6列的表。

1.ID (number)(PK)
2.USER_ID (number)
3.ROLE_ID (number)
4.CREATED_TS (date)
5.CREATED_BY (VARCHAR2)
6.ACTIVE_IND (VARCHAR2)

我通过该表中的POST REST API调用插入数据。我在Java Repository中发出一个查询。

public UserRoles save(final UserRoles u) {
        final String insertQuery = "INSERT INTO VEB_USER_ROLES(ID, USER_ID, ROLE_ID, CREATED_TS, CREATED_BY, ACTIVE_IND) " +
                "VALUES(VEB_USER_ROLES_SEQ.NEXTVAL, ?, ?, ?, 'PROD_MASTER', 'Y')";
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                PreparedStatement ps = con.prepareStatement(insertQuery, new String[]{"ID"});
                ps.setLong(1, u.getUserId());
                ps.setLong(2, u.getRoleId());
                ps.setDate(3, new java.sql.Date(System.currentTimeMillis()));   
                return ps;
            }
        }, keyHolder);
        return u;

    }

查询工作正常,数据已经插入。我只想添加一个检查,如果存在相同的UserID和RoleID,则不应该插入。 例如在DB中我有Userid' 1'和roleId' 1'我发送相同的值,即用户ID' 1'和角色ID' 1'它不应该插入。 任何人都可以指导我这件事。

2 个答案:

答案 0 :(得分:2)

在两列上创建UNIQUE约束:USER_IDROLE_ID

ALTER TABLE yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);

示例:插入时的状态 -

- 成功:

INSERT yourtablename(USER_ID, ROLE_ID) VALUES(1, 22);

- 成功:

INSERT yourtablename(USER_ID, ROLE_ID) VALUES(2, 23);

- 失败:

INSERT yourtablename(USER_ID, ROLE_ID) VALUES(1, 23);

如果无法ALTER数据库结构,您也可以通过代码检查: - 在插入新的记录检查之前USER_ID& DB中存在ROLE_ID。 使用选择查询&检查是否存在类似的记录。

这只是一个想法,如果需要,请让它为你工作:

$exists = SELECT COUNT(*) no_of_similar_records FROM yourTableName WHERE USER_ID = $USER_ID AND ROLE_ID = $ROLE_ID

如果有值,则不再INSERT。 所以这里我们不需要对结构进行数据库更新。

这可能对你有帮助..

答案 1 :(得分:0)

处理此问题的几种方法

  1. 在列Userid,Roleid或
  2. 上的表上添加唯一约束
  3. 在尝试插入之前执行SELECT以检查它们是否已存在,或
  4. 在NOT MATCHED
  5. 时使用merge into插入