所以我最近开始使用postgres。而且由于我不能执行“IF else”,除非在函数中我很好奇哪一个更好的资源和明智的性能。 1.创建一个如下所示的函数来查询存储该ID的数据库。检查id是否为null,如果是则插入else返回id;哪个更好:查询数据库两次或创建一个函数来查询一次
CREATE OR REPLACE FUNCTION getallfoo() RETURN INT AS
$BODY$
DECLARE
id INTEGER := (SELECT id FROM foo where (lots of condition checks 15+);
BEGIN
IF id is null then
INSERT INTO foo(a,b,c,d,e,f) SELECT (1,2,3,4,5,6) RETURNING id INTO id;
return id;
ELSE
RETURN id;
END IF;
END;
$BODY$
Language 'plpgsql';
select * from getallfoo();
或2:首先尝试向数据库中插入数据,如下所示。随后在插入失败时查询数据库。我有一个理由,先插入那不是这个问题的重点。我知道大多数人会说,先查询然后如果不存在插入。
INSERT INTO foo (a,b,c,d,e,f, ........, 15+) SELECT (1,2,3,4,5,6, ........., 15+)
WHERE NOT EXIST(SELECT 1 from foo where a=1, b=2, c=3, up to 15);
因为我在java中工作我只是检查是否rs.getGeneratedKeys()= 0;如果插入失败,我会重新查询该数据库的ID;
SELECT id from foo where a=1, b=2, c=3, ect;
所以现在的问题是因为在我的询问我的病情检查是冗长的是它最好创建一个功能,一旦查询数据库。或者跳过该功能并查询两次。我在大约50张不同的表上做了这些类型的插入。
问题是你可以使用preparedStatement(上面的函数)在java中创建一个函数(结果集) ResultSet rs = ps.executeUpdate();
通常,查询次数越少意味着执行时间越快。如果你能够提高性能,这是值得的。 –
您能否详细说明“首先插入的原因是不是这个问题的重点”? IMO这是一个反模式... – home
我正在与一个测试平台,我是唯一的1插入数据到数据库中的数据。有两个原因检查记录是否已经存在1是我的一些数据是多对多的关系,因此记录可能已经存在,但不太可能。其次,如果有人试图重新解析包含将数据加载到数据库的文件的文件,这是不可能发生的,因为我是唯一一个将数据插入数据库的交互。一般来说,数据不存在比它存在的可能性更大。 – Jeremy