【发布时间】:2015-03-25 13:36:02
【问题描述】:
我有一个数据库表,我们称之为Foo。 Foo 有一个id 列(很长),还有一些数据列,我们称它们为Bar1 和Bar2
在出现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 表中的数据将具有它们的ids 相同的行号。
但是,当Foo 表中存在现有数据并且我执行上一个查询时,我得到一个异常,指出“Key (id)=(1) 已经存在”。
显然,我不希望 row_number 查看源 OldFoo 表,而是查看新的 Foo 表。
在 Java 中绘制一个并行示例,使用 HashMap<Integer, Foo> 作为存储库:
map.put(map.size() + 1, fooObject);
有没有办法实现这一点,生成与目标表中的行号相同的 ID?
【问题讨论】:
-
您希望将列声明为
serial,以便数据库处理自动递增。在此处查看数字类型:postgresql.org/docs/9.4/static/datatype-numeric.html。 -
我忘了说,表格是通过 JPA 生成的,所以我不确定如何使用实体类来实现。
标签: java sql postgresql insert primary-key