Java 如果存在返回id,则在postgres中插入
我是postgres的新手,我必须用它来填充数据库。我不能提交我的实际代码供参考,但我的程序是用java编写的,我正试图按照这些思路做一些事情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
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有点仓促;这并不是一个完全颠覆,而是一个“如果找不到就搜索并插入”。