我有一个数据库表,我们称之为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
个行号相同。
但是,当Foo
表中存在现有数据并且我执行上一个查询时,我得到一个例外,说明&#34; Key(id)=(1)已经存在&#34;。< / p>
显然,我不希望row_number查看源OldFoo
表,而是查看新的Foo
表。
在Java中绘制并行示例,使用HashMap<Integer, Foo>
作为存储库:
map.put(map.size() + 1, fooObject);
有没有办法实现这一点,生成与目标表中的行号相同的ID?
答案 0 :(得分:1)
我强烈建议您找到使用serial
的方法。但是,假设表中没有发生其他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)
的内容。这使代码更易于维护和理解。