【发布时间】:2021-02-22 08:35:43
【问题描述】:
我有一个临时表,其中包含 id 和 value 列:
| id | value |
我有一个表格,它用g_id 和value 列聚合数据:
| g_id | value |
临时表中的id是按id本地排序的,这里有2个例子:
临时表 1
| id | value |
+----+--------+
| 1 | first |
| 2 | second |
| 3 | third |
临时表 2
| id | value |
+----+-------+
| 2 | alpha |
| 3 | beta |
| 4 | gamma |
我想将临时表中的所有行插入到全局表中,同时全局排序 g_id。如果我在临时表 2 之前插入临时表 1,它应该是这样的:
global_table
| group_id | value |
+----------+--------+
| 1 | first |
| 2 | second |
| 3 | third |
| 4 | alpha |
| 5 | beta |
| 6 | gamma |
对于我来说,如果连续的数字之间有跳转是可以的,如果同时进行2次插入,则可以交错。要求基本上是id列一直在增加。
例如 假设我有 2 组查询同时运行,并且 global_table 中的 group_id 是自动递增的:
查询 1:
INSERT INTO global_table (value) VALUES (first)
INSERT INTO global_table (value) VALUES (second)
INSERT INTO global_table (value) VALUES (third)
查询 2:
INSERT INTO global_table (value) VALUES (alpha)
INSERT INTO global_table (value) VALUES (beta)
INSERT INTO global_table (value) VALUES (gamma)
我可以得到这样的东西:
global_table
| group_id | value |
+----------+--------+
| 1 | first |
| 3 | alpha |
| 4 | second |
| 5 | third |
| 6 | beta |
| 7 | gamma |
如何通过从表中插入来实现这样的效果?喜欢
INSERT INTO global_table (value)
SELECT t.value
FROM temp_table t
很遗憾,这可能不会导致 id 一直递增。
【问题讨论】:
-
如果 global_table.id 是自动递增的,你插入到 select 中会起作用。
-
具体来说,我使用的是 SQL Server,但如果有一个适用于任何数据库产品的通用答案,而不是使用特定供应商的特定功能,那就太好了。
-
@Eric 实际问题是什么?
this may not result in a incrementing id all the time.不,这将导致每次 都增加 ID。您无需为任何数据库、任何供应商做任何事情。如果这些列是自动生成的,它们将由数据库为每个新行生成。 -
@Eric 你的意思是 连续 而不是递增?为什么,密钥有一些商业价值?在任何其他情况下,只要新值始终大于现有值,ID 有间隙就没有问题
-
BTW 3 个独立的 INSERT 不是批处理操作,它是 3 个独立的 INSERT。要一次插入 3 行,您可以使用 table value constructor syntax,例如
INSERT INTO ... VALUES ( (first),(second),(third) )
标签: sql sql-server