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

标签 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 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/

相关文章:

java - 关于Java重载和动态绑定(bind)的问题

sql - 如何根据特定字段中的数据向查询添加行

sql - 选择除 1 个字段外数据几乎相同的行

node.js - Bookshelf JS 关系 - 计数

postgresql - 确定真空后的自由空间

postgresql - 使用 Citus 任务跟踪器执行器时,所有分布式查询都会失败

java - 我可以使用spring进行幂等注入(inject)吗?

javascript - 如何从 Android Java 中无延迟地调用 WebView Javascript 中的函数?

基于代理的模型中的 Java NullPointerException

mysql - 如何使用MySQL选择连续组数的最大值和最小值?