作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
我是一名优秀的程序员,十分优秀!