Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果存在返回id,则在postgres中插入_Java_Postgresql - Fatal编程技术网

Java 如果存在返回id,则在postgres中插入

Java 如果存在返回id,则在postgres中插入,java,postgresql,Java,Postgresql,我是postgres的新手,我必须用它来填充数据库。我不能提交我的实际代码供参考,但我的程序是用java编写的,我正试图按照这些思路做一些事情 IF EXISTS (SELECT 1 FROM TEST WHERE FOO = 2 and BAR = 3) BEGIN SELECT TableID FROM TEST WHERE FOO = 2 and BAR = 3 END ELSE BEGIN INSERT INTO TEST(FOO, BAR) VALUES(2, 3

我是postgres的新手,我必须用它来填充数据库。我不能提交我的实际代码供参考,但我的程序是用java编写的,我正试图按照这些思路做一些事情

IF EXISTS (SELECT 1 FROM TEST WHERE FOO = 2 and BAR = 3) 
 BEGIN
   SELECT TableID FROM TEST WHERE FOO = 2 and BAR = 3
 END
 ELSE
 BEGIN
   INSERT INTO TEST(FOO, BAR) VALUES(2, 3)
 END
我正试图沿着这些思路做一些事情,因为我的程序只是解析一堆文件并填充数据库。我需要确保,如果有人返回并在相同的文件上再次运行该程序,数据库不会包含重复的条目。找到的与此插入/记录关联的id用于填充链接表。我在另一个stackoverflow上发现了这个示例,只是它与MicrosoftSQLServer2005有关。我正在使用postgres,但它在IF的第一行就失败了。我知道不同的数据库语言的操作略有不同。是否有一种方法可以使用postgres执行IF EXISTS返回ID else插入

目前,我正在检查条目是否存在,以及它是否没有插入。但是,我必须再次查询数据库,以获取记录存在时的id

int id = 0;
PrepareStatement ps = conn.prepare(SQL command, statement.generatekeys);  //syntax is not correct for the preparestatement but i'm not looking at my code and dont remember it off top of my head.
ResultSet rs = ps.executeUpdate();
if(rs.next()){
   if(rs.getGeneratedKeys().rows() > 0)  //not sitting at my code but there is a way to check if a key was generated from an insert
     id = rs.getGeneratedKeys()
   }else{
     id = rs.getInt(1);       
   }
}
更新摘自评论:

更好的问题是是否有一种方法可以在不查询/检查where子句两次的情况下执行if exist返回id else insert。


我希望避免执行两次
检查,从现有数据或新条目中获取我的id。我的条件检查相当长,因为我的一些表包含14个以上的属性。目前我要做的是在数据库中查询一次,如果不存在,则执行
INSERT
。如果我的
getGeneratedKeys().size()=0
我知道
INSERT
失败,因为它存在,然后我使用原始查询中的相同where子句重新查询数据库并获取id。

这与
UPSERT
MERGE
操作密切相关,PostgreSQL不直接支持该操作。Upsert在并发环境中比您预期的要复杂得多

upsert的大多数并发问题也适用于您想要做的事情。如果一次有多个线程执行更新,则当前代码是完全错误的

读取并搜索堆栈溢出,以查找
[postgresql]upsert
[postgresql]merge
,然后


您应该能够相当容易地调整这里给出的PL/PgSQL函数来完成这项工作。但是,它只能在
READ COMMITTED
隔离模式下正确运行。

我在看你提到的两件事,它在postgres中没有if-exist返回id-else-insert的示例,甚至没有为我指明一个可能有助于解释在postgres中是否可能的方向。@Jeremy这是同一问题的变体,同样的问题。您可以调整中给出的PL/PgSQL函数以适应它。如果我正确理解并阅读了示例,则需要知道查询中插入内容的id。我的每个if-exist返回id else-insert查询都使用sequence。因此,我不知道插入的ID,直到它完成并从rs.getGeneratedKeys()获取之后。因此,我不明白我如何才能让这个例子成为你的参考。我检查它是否存在只是检查每个列字段是否与我试图输入的相同。假设是,我想返回所述id。更好的问题是“是否有一种方法可以在不查询/检查where子句两次的情况下执行if exist返回id else insert。”即不执行where检查两次以从现有数据或新条目获取我的id。我的条件检查相当长,因为我的一些表包含14个以上的属性。目前,我要做的是在数据库不存在的情况下进行一次插入查询。如果我的getGeneratedKeys().size()=0,我知道插入失败,因为它存在,然后我使用原始查询中的同一where子句重新查询数据库,获取id。@Jeremy Ah,这更清楚地解释了您真正想要的内容。我想我们将此标记为dup有点仓促;这并不是一个完全颠覆,而是一个“如果找不到就搜索并插入”。