插入前如何检查?

问题描述 投票:0回答:2

我有一个有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',我发送相同的值,即userid'1'和角色id'1',它不应该被插入。任何人都可以指导我这件事。

java oracle jdbc
2个回答
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_IDROLE_ID是否存在于DB中。使用选择查询并检查是否存在类似记录。

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

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

如果它有一个值,请不要再次使用INSERT。所以这里我们不需要对结构进行DB更新。

这可能对你有帮助..


0
投票

几种方法来处理这个问题

  1. 在Userid,Roleid或列上的表上添加唯一约束
  2. 在尝试插入之前执行SELECT以检查它们是否已存在,或者
  3. 不匹配时使用merge into插入
© www.soinside.com 2019 - 2024. All rights reserved.