sql-server - SQL Server - 如何在多行 INSERT 事务中手动递增 PK

标签 sql-server

我在 SQL Server 中工作。我有一个包含 PK int 列的表。此列未启用自动递增,并且不允许我更改架构。我需要手动将很多行(可能数千行)插入到该表中。插入的数据都不会来自任何现有表。但是,我需要确保 PK 列对于每个新行都增加 +1。我当前的脚本如下所示:

BEGIN TRAN
    INSERT INTO DB1.dbo.table1
    (PK_col, col1)
    VALUES
    (10, 'a')
    ,(11, 'something')
    ,(12, 'more text')
    ;

我已经通过预查询 (SELECT MAX(PK_col) + 1) 知道 PK_col 当前为 9。

我的问题是确保 PK 列对于每个新行都增加 +1。因为可能有数千行要插入,所以我想减少跳过值或抛出 PK 约束违规的可能性。我知道我可以在数据库之外(通过 Excel)实现这一点,只要我在运行 SQL 脚本之前验证 PK 值即可。但是,我想创建一个解决方案来处理 TRAN 语句本身内的自动增量。这可能吗(没有遇到竞争条件)?如果是,怎么办?

最佳答案

下面应该做你想做的:

INSERT INTO DB1.dbo.table1(PK_col, col1)
    SELECT COALESCE(l.max_pk_col, 0) + row_number() over (order by (select null)) as PK_col,
           col1
    FROM (VALUES ('a'), ('something'), ('more text')) v(col1) CROSS JOIN
         (SELECT MAX(pk_col) as max_pk_col FROM DB1.dbo.table1) l;

你需要小心这种安排。在 INSERT 期间锁定整个表可能是个好主意——如果还有其他任何事情可以更新表的话。

关于sql-server - SQL Server - 如何在多行 INSERT 事务中手动递增 PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42013000/

相关文章:

sql - 确定 SQL Server View 中引用的表

sql - select语句where子句两个条件

sql-server - 当表不存在时,如何解决“"Table ' dbo.Foo'已经存在。”错误?

c# - 如果从 Windows 服务执行,与 SQL Server 的连接失败

node.js - docker stack与mssql和node,如何正确连接到数据库?

c# - EntityFramework 抛出错误 : The table does not have a primary key defined

c# - 如何在调用 SQL Server 数据库调用的 Web 服务器上运行 AngularJS

sql-server - 首先使用实体​​框架代码播种数据时如何控制主键值

sql - 当快速加载选项打开且最大插入提交大小设置为零时,SSIS 如何重定向 OLEDB 目标中的行

mysql - SQL 查询从带有输入参数的单个字段中查找多个值