我是 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 问题上发现了这个例子,它只与 Microsoft SQL Server 2005 相关。我使用的是 postgres,它在 IF 的第一行就失败了。我了解不同的数据库语言的操作略有不同。有没有办法使用 postgres 执行 IF EXISTS 返回 ID 否则插入。
目前我正在检查该条目是否存在以及它是否没有插入。但是后来我不得不再次查询数据库以获取记录的 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 exists return id else insert。
我想避免WHERE
两次检查以从现有数据或新条目中获取我的 id。我的条件检查相当冗长,因为我的一些表包含超过 14 个属性。目前我所做的是在执行INSERT
if 不存在时查询数据库。如果我getGeneratedKeys().size() = 0
知道INSERT
失败是因为它存在,然后我使用原始查询中的相同 where 子句重新查询数据库并获取 id。