【问题标题】:How to do a batch insert version of auto increment?如何做自动增量的批量插入版本?
【发布时间】:2021-02-22 08:35:43
【问题描述】:

我有一个临时表,其中包含 idvalue 列:

| id | value |

我有一个表格,它用g_idvalue 列聚合数据:

| 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


【解决方案1】:

要求基本上是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 生成的值。而group_id 的价值third 将大于价值second

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

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


请参阅我的answer 以获取类似的question,了解更多技术细节和参考资料。

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多