如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?

Posted

技术标签:

【中文标题】如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?【英文标题】:How to insert variable (@id) in table as auto increment in SQL server query? 【发布时间】:2016-04-11 15:47:36 【问题描述】:

我想将@id 值作为自动增量插入到 Items 表中。

表名=项目 列 = 代码、名称。

列代码不允许空值并且是唯一的但它没有自动增量, 我试图编写查询,它将代码列中的值 (1,2,3,4,...) 填充为自动增量,但它不起作用

这是我的查询

DECLARE @id INT 
SET @id = (select MAX(Code) from Items)

SET @id =@id+1

insert into Items (Code,Name) values(@id,'m')

这是错误

消息 515,第 16 级,状态 2,第 6 行 无法将值 NULL 插入到列“代码”、表“项目”中;列不允许空值。插入失败。 声明已终止。

我希望将@id 作为自动增量插入到代码列中。

请任何人都可以帮助我。

【问题讨论】:

你用的是什么数据库? 【参考方案1】:

我可以假设你的桌子是空的吗?

在这种情况下,

SET @id = (select MAX(Code) from Items)

为空,

所以

SET @id =@id+1

也是空的。

正确的代码是:

SET @id = (select ISNULL(MAX(Code),0) from Items)

当没有行时将返回数字 0。

典型的初学者 SQL 错误 - 请注意 SQL 中 NULL 的“有毒”性质,它会将其接触到的所有内容都变成 - NULL。

【讨论】:

select 和 insert 之间存在 MAX(Code) / @id 变化的风险 是和不是。这个问题与锁定无关。有很多场景都不是问题——从在可序列化锁定下运行的代码到在单线程 ETL 进程中运行代码。我回答了提出的问题,假设 OP 知道站点规则(提供最少的示例代码来复制,忽略所有其他元素)。 而且有 种情况会出现问题。 OP 的一个基本问题得分为 8,您认为他们了解站点规则和锁定?【参考方案2】:

如果您使用@id,则可能会在两个语句之间发生更改

由于下面是一个语句,因此您不需要将其包装在事务中

insert into Items (Code, Name) 
select MAX(Code) + 1, 'm'
  from items

我认为这涉及空项目

insert into Items (Code, Name) 
select isnull(MAX(Code), 0) + 1, 'm'
  from items

【讨论】:

以上是关于如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PL/SQL 中的过程在表中插入多个值?

如何使用 sql Bulkcopy 在表中插入 datagridview 行

通过 jdbctemplate 在表中插入记录时如何获取自动增量 ID

如何使用sql在表中插入数据类型为BLOB的8796字符长数据?

在使用 Entity Framework 数据库优先在表上插入行之前,如何从 PL/SQL 执行触发器?

如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句