postgresql中where子句中的语法错误

时间:2017-04-09 17:37:18

标签: postgresql where

 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在此语句中显示错误。 我想在检查并确保没有这样的记录存在之后将记录插入到数据库中

这个陈述是正确的,还是我在尝试垃圾代码?

请提前帮助,请提供帮助

2 个答案:

答案 0 :(得分:1)

您的错误消息的原因是INSERT语句不允许WHERE子句。

您只能在where声明(或SELECTDELETE声明)中添加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?