我有一个数据库表,我们称之为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
中的数据表将有他们的 id
s 相等的行号。
但是,当 Foo
中存在现有数据时表并执行上一个查询,我收到一个异常,指出“Key (id)=(1) 已存在”。
显然,我不想让row_number看源码,OldFoo
表,而是新的,Foo
表。
要在 Java 中绘制并行示例,请使用 HashMap<Integer, Foo>
作为存储库:
map.put(map.size() + 1, fooObject);
有没有办法实现这一点,生成与目标表中的行号相同的 ID?
最佳答案
我强烈建议找到一种使用串行
的方法。但是,假设表上没有发生其他 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)
的内容。这使得代码更易于维护和理解。
关于java - 使用 PostgreSQL 将新记录插入到行号为 id 的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29257244/