如何进行自动增量的批量插入版本?



>我有一个临时表,其中包含id列和value列:

| id | value |

我有一个表,它聚合了带有列g_idvalue的数据:

| g_id | value |

临时表中的 id 按 id 本地排序,这里有 2 个示例:

temp_table 1

| id | value  |
+----+--------+
| 1  | first  |
| 2  | second |
| 3  | third  |

temp_table 2

| id | value |
+----+-------+
| 2  | alpha |
| 3  | beta  |
| 4  | gamma |

我想将临时表中的所有行插入到全局表中,同时对g_id进行全局排序。如果我在临时表 1 之前插入临时表 2,它应该是这样的:

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 递增。

要求基本上是 id 列始终 增加。

如果我理解正确,您应该在INSERT语句中使用ORDER BY

INSERT INTO global_table (value)
SELECT t.value
FROM temp_table t
ORDER BY t.id;

在 SQL Server 中,如果包含ORDER BY t.id,它将保证在global_table表中生成的新 ID 将按指定的顺序排列。

我不知道其他数据库,但SQL ServerIDENTITY有这样的保证。


使用您的示例数据,可以保证为值second生成的group_id将大于为值first生成的值。价值thirdgroup_id将大于价值second

它们可能不是连续的,但如果指定ORDER BY,它们的相对顺序将被保留。

第二个表也是如此,即使您同时运行两个INSERT语句也是如此。生成的group_id可以在两个表之间交错,但将保证每个语句中的相对顺序。


请参阅我对类似问题的回答,其中包含更多技术细节和参考资料。

相关内容

  • 没有找到相关文章

最新更新