Java 插入前如何检查?

Java 插入前如何检查?,java,oracle,jdbc,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存储库中启动一个查询 public UserRoles save(final UserRoles u) { final String inse

我有一张有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存储库中启动一个查询

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,则不应插入。 例如,在数据库中,我有Userid“1”和roleId“1”,并且我发送了相同的值,即Userid“1”和roleId“1”,因此不应插入。
有人能给我指点一下吗

在两列上创建一个
UNIQUE
约束:
USER\u ID
ROLE\u 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, 22);
INSERT yourtablename(USER_ID, ROLE_ID) VALUES(2, 23);
--失败:

如果无法
更改
数据库结构,您也可以通过代码检查: -在插入新记录之前,检查数据库中是否存在
用户ID
&
角色ID
。 使用select查询并检查是否存在类似的记录

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

$exists=从您的TableName中选择COUNT(*)无类似记录,其中USER\u ID=$USER\u ID和ROLE\u ID=$ROLE\u ID

ALTER TABLE yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
如果有值,则不要再次插入。 所以在这里,我们不需要对结构进行DB更新


这可能会帮助您..

在两列上创建一个
唯一的
约束:
用户ID
角色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, 22);
INSERT yourtablename(USER_ID, ROLE_ID) VALUES(2, 23);
--失败:

如果无法
更改
数据库结构,您也可以通过代码检查: -在插入新记录之前,检查数据库中是否存在
用户ID
&
角色ID
。 使用select查询并检查是否存在类似的记录

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

$exists=从您的TableName中选择COUNT(*)无类似记录,其中USER\u ID=$USER\u ID和ROLE\u ID=$ROLE\u ID

ALTER TABLE yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
如果有值,则不要再次插入。 所以在这里,我们不需要对结构进行DB更新


这可能会帮助您处理此问题。

有两种方法

  • 在Userid、Roleid或
  • 在尝试插入之前进行选择,以检查它们是否已经存在,或者
  • 不匹配时使用插入

  • 有两种方法可以解决这个问题

  • 在Userid、Roleid或
  • 在尝试插入之前进行选择,以检查它们是否已经存在,或者
  • 不匹配时使用插入

  • 在两列上创建唯一索引并在插入期间处理异常在两列上创建唯一索引并在插入期间处理异常约束是正确的方法。依赖应用程序逻辑将不可避免地导致数据损坏。例如,如果两个会话尝试为相同的
    (用户id,角色id)
    排列创建记录,则此处发布的所有SQL解决方案在多用户环境中都将失败。祝您愉快。约束是正确的方法。依赖应用程序逻辑将不可避免地导致数据损坏。例如,如果两个会话试图为相同的
    (用户id,角色id)
    排列创建记录,则此处发布的所有SQL解决方案将在多用户环境中失败。祝您愉快。