在SQL中插入语句之前检查重复项

时间:2017-10-24 09:56:04

标签: java sql database sql-insert

我有一个如下代码:

protected String getCreateSQL() {
    return "INSERT INTO ROLE_ASSIGNMENT ( ID, ORG_ID, ROLE_ID, USER_ID, EFFECTIVE_FROM, EFFECTIVE_TO, ASSIGNMENT_TYPE ) VALUES ( ?, ?, ?, ?, ?, ?, ? )";
}

我需要在插入数据之前检查 ROLE_ASSIGN 表中是否已经存在 ROLE_ID 。如果表中已存在 ROLE_ID ,则不应插入该值。

有没有办法在不改变SQL端的数据库约束的情况下这样做?

3 个答案:

答案 0 :(得分:0)

如果您在数据库中有约束,您将获得异常,只需捕获它(可能是0x28)。

如果您在DB中没有ROLE_ID约束,则需要手动检查。您可以使用where子句执行select:char。如果它没有返回一行,则可以执行insert语句。

答案 1 :(得分:0)

这更像是一个sql问题?您可以通过两个步骤完成 - 首先检查记录是否存在(选择该记录),如果它不存在则添加它。

如果你想一步完成并且不添加数据库约束,你将不得不编写一些bizzare SQL,例如:

INSERT INTO ROLE_ASSIGNMENT 
SELECT 123,434,_values_go_here.... FROM ROLE_ASSIGNMENT A
LEFT OUTER JOIN ROLE_ASSIGNMENT B on B.ID=123 where B.ORG_ID is null limit 1

(我不确定它是否有效,但你可以看到这个想法) 有些数据库允许你做一个大的语句,选择值变成变量和一些if else的情况,但这一切都使得代码难以阅读和遵循,所以更好地避免它。

约束是有原因的;)所以我的建议是在插入调用之前使用它们或手动进行检查。

答案 2 :(得分:0)

例如,使用不存在合并。在Oracle中它看起来像

merge into ROLE_ASSIGNMENT ra
    using dual
    on (ra.ROLE_ID=?)
    when not matched then
    insert( ID, ORG_ID, ROLE_ID, USER_ID, EFFECTIVE_FROM, EFFECTIVE_TO, ASSIGNMENT_TYPE )
     values ( ?, ?, ?, ?, ?, ?, ? )

Dual 是一个特殊的oracle表,包含1行和1列。

或使用插入选择

Oracle

 INSERT INTO ROLE_ASSIGNMENT 
    ( ID, ORG_ID, ROLE_ID, USER_ID, EFFECTIVE_FROM, EFFECTIVE_TO, ASSIGNMENT_TYPE ) 
        select ?, ?, ?, ?, ?, ?, ? from dual 
  where not exists (select 1 from ROLE_ASSIGNMENT where role_id=?)

对于 MySQL 将类似(不确定)

INSERT INTO ROLE_ASSIGNMENT 
        ( ID, ORG_ID, ROLE_ID, USER_ID, EFFECTIVE_FROM, EFFECTIVE_TO, ASSIGNMENT_TYPE ) 
            select * from (select ?, ?, ?, ?, ?, ?, ?) as d 
      where not exists (select 1 from ROLE_ASSIGNMENT where role_id=?)
相关问题