使用 PostgreSQL 将行号作为 id 的新记录插入 table

Inserting new records into table with row number as id with PostgreSQL

我有一个数据库table,我们称它为Foo。 Foo 有一个 id 列(很长)和一些数据列,我们称它们为 Bar1Bar2

在有 id 列之前,有一个脚本可以正常工作,它可以简单地将新内容添加到 table 中,如下所示:

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

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

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

并且 Foo table 中的数据将具有 id 相等的行号。

但是,当 Foo table 中存在现有数据并且我执行上一个查询时,我得到一个异常,指出 "Key (id)=(1) already exists".

显然,我不希望 row_number 查看源代码 OldFoo table,而是查看新的 Foo table ].

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

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

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

强烈推荐想办法使用serial。但是,假设在 table 上没有发生其他 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)。这使代码更易于维护和理解。