我有一个如下代码:
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端的数据库约束的情况下这样做?
答案 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=?)