如何在表中插入变量(@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 服务器查询中的自动增量?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 sql Bulkcopy 在表中插入 datagridview 行
通过 jdbctemplate 在表中插入记录时如何获取自动增量 ID
如何使用sql在表中插入数据类型为BLOB的8796字符长数据?