使用 PostgreSQL 将行号作为 id 的新记录插入 table
Inserting new records into table with row number as id with PostgreSQL
我有一个数据库table,我们称它为Foo
。 Foo 有一个 id
列(很长)和一些数据列,我们称它们为 Bar1
和 Bar2
在有 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)
。这使代码更易于维护和理解。
我有一个数据库table,我们称它为Foo
。 Foo 有一个 id
列(很长)和一些数据列,我们称它们为 Bar1
和 Bar2
在有 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)
。这使代码更易于维护和理解。