fl=s.executeUpdate("
insert into demi(rno,subcode,subname,intm,extm,crd,resultdate)
values(
'13JG1A05A0',
'RT22058',
' FREE OPEN SOURCE SOFTWARE(FOSS) LAB ',
'20',
'70',
'2',
'MAY 2015'
)
end where not exists(SELECT * FROM demi WHERE rn0 ='13JG105A0' AND subcode='RT22058')
");
我在jsp中使用postgresql作为后端,我的IDE在此语句中显示错误。 我想在检查并确保没有这样的记录存在之后将记录插入到数据库中
这个陈述是正确的,还是我在尝试垃圾代码?
请提前帮助,请提供帮助
答案 0 :(得分:1)
您的错误消息的原因是INSERT
语句不允许WHERE
子句。
您只能在where
声明(或SELECT
或DELETE
声明)中添加UPDATE
子句
所以你需要摆脱VALUES
子句并使用insert into .. select ...
语法:
insert into demi(rno,subcode,subname,intm,extm,crd,resultdate)
select '13JG1A05A0',
'RT22058',
' FREE OPEN SOURCE SOFTWARE(FOSS) LAB ',
'20',
'70',
'2',
'MAY 2015'
where not exists (SELECT *
FROM demi
WHERE rn0='13JG105A0'
AND subcode='RT22058');
但是对于预期的用例:
我正在尝试将特定记录插入到db中,当且仅当不存在具有相同rno和主题代码列的其他记录时
如果你对(rno, subcode)
有一个独特的约束(你应该这样做),有一个更好的选择 - 使用on conflict
子句:
insert into demi (rno, subcode, subname, intm, extm, crd, resultdate)
values
(
'13JG1A05A0',
'RT22058',
' FREE OPEN SOURCE SOFTWARE(FOSS) LAB ',
'20',
'70',
'2',
'MAY 2015'
)
on conflict (rno, subcode) do nothing;
再次说明:只有在这两列上有唯一约束(或索引)时,on conflict
才会起作用。
无关,但是:
您应该使用与基础数据类型匹配的文字指定每个常量值。 '20'
是一个字符常量,20
是一个数字。如果intm,extm和crd重新编号,则不提供字符值。此外,如果resultdate
列为date
列,则'MAY 2015'
也不起作用。
答案 1 :(得分:0)
Not sure how
end where not exists(SELECT * FROM demi WHERE rn0 ='13JG105A0' AND subcode='RT22058')
got into your code, but the whole thing is suspicious what do you even want that to do?