使用PostgreSQL将新记录插入到行号为id的表中

时间:2015-03-25 13:36:03

标签: java sql postgresql insert primary-key

我有一个数据库表,我们称之为Foo。 Foo有一个id列(很长),还有一些数据列,我们称之为Bar1Bar2

在有id列之前,有一个脚本曾经工作过,只需在表格中添加新内容:

INSERT INTO Foo
SELECT OldBar1, SUM(OldBar2)
FROM OldFoo
GROUP BY OldBar1

现在,在添加id后,如果我最初有一个新的Foo表空,那么我可以这样做:

INSERT INTO Foo
SELECT row_number() OVER() as id, OldBar1, SUM(OldBar2)
FROM OldFoo
GROUP BY OldBar1;

Foo表中的数据的id个行号相同。

但是,当Foo表中存在现有数据并且我执行上一个查询时,我得到一个例外,说明&#34; Key(id)=(1)已经存在&#34;。< / p>

显然,我不希望row_number查看源OldFoo表,而是查看新的Foo表。

在Java中绘制并行示例,使用HashMap<Integer, Foo>作为存储库:

map.put(map.size() + 1, fooObject);

有没有办法实现这一点,生成与目标表中的行号相同的ID?

1 个答案:

答案 0 :(得分:1)

我强烈建议您找到使用serial的方法。但是,假设表中没有发生其他insert操作,以下内容应该对您有用:

INSERT INTO Foo
    SELECT (f.maxId + row_number() OVER() )as id, OldBar1, SUM(OldBar2)
    FROM OldFoo CROSS JOIN
         (SELECT MAX(id) as MAX(ID) FROM Foo) f
    GROUP BY OldBar1, f.maxId;

一条建议:使用INSERT时总是包含列名。因此,您的查询应该是类似INSERT INTO Foo(Id, OldBar)的内容。这使代码更易于维护和理解。