【问题标题】:Syntax error in where clause in postgresqlpostgresql中where子句的语法错误
【发布时间】:2017-04-09 17:37:17
【问题描述】:
 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 在此语句中显示错误。 我想在检查并确保不存在此类记录后将记录插入数据库

这个说法正确吗,还是我在尝试垃圾代码?

请帮忙,提前谢谢

【问题讨论】:

  • => end where not exists 应该是 AND where not exists
  • end where not exists 应该是where not exists
  • insert 没有 where 子句。

标签: postgresql where


【解决方案1】:

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

您只能将where 子句添加到SELECT 语句(或DELETEUPDATE 语句)

所以你需要去掉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');

但是对于预期的用例:

当且仅当不存在具有相同 rno 和主题代码列的其他记录时,我才尝试将特定记录插入 db

如果您对 (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 是一个数字。 Ìf intm、extm 和 crd re 数字,不提供字符值。此外,如果 resultdatedate'MAY 2015' 也不起作用。

【讨论】:

  • 谢谢你为我节省了很多时间,我怀疑如果发生冲突,我想采取一些措施,我应该在哪里编写代码
  • @HimajaSidhireddi:不需要代码。 do nothing 导致有问题的行被静默忽略并且不会插入该行。
  • 但我需要写我有 2 个表 demi 并提供。如果 demi 中存在记录,如果 crd 中的当前值大于前一个,我需要更新 demi 中的记录。然后复制前一个记录提供,所以我需要为所有这些编写代码,并且“冲突插入”会起作用吗?请帮助
  • 您在问题中没有提到第二张桌子。在收到答案后更改问题的范围被认为是不礼貌的。最好问一个带有附加要求的问题(您可以参考这个)。或者至少edit您当前的问题以反映您的问题的扩展范围。
  • 抱歉给您带来不便,我正在为第一个 tym 发布一个 qstn,我将要求一个新的 qstn,然后它可以用于更新并且什么都不做
【解决方案2】:

不知道如何

end where not exists(SELECT * FROM demi WHERE rn0 ='13JG105A0' AND subcode='RT22058')

进入你的代码,但整个事情都很可疑,你到底想要做什么?

【讨论】:

  • 当且仅当不存在具有相同 rno 和主题代码列的其他记录时,我才尝试将特定记录插入 db
猜你喜欢
  • 2023-01-21
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多