【问题标题】:How to insert variable (@id) in table as auto increment in SQL server query?如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?
【发布时间】: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 作为自动增量插入到代码列中。

请任何人都可以帮助我。

【问题讨论】:

  • 你用的是什么数据库?

标签: sql-server tsql sql-insert


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多