繁体   English   中英

删除最后一条记录后从数据库表中获取 MAX id 号

[英]Get MAX id number from database table after deleting last record

我想为“产品”获取一个新的行 id,为此我使用 MAX SQL 命令作为以下(命令在插入新记录按钮单击事件中):

SqlCommand cmd = new SqlCommand("Select ISNULL(MAX(id)+1,0) from products", SqlCon);

问题是当有 ID 为 10,11,12(12 是 MAX)的行并且我删除 id 12 记录时,当新的 id 行是 13(“id”字段是身份增量的 PK 时,我得到 MAX+1 id 12 1)。 我可以用其他方式做吗?

例子:

id  prodect
--  -------
1     dog
2     cat
3     mouse
4     elefant

当我删除第 4 行时,我得到 MAX(id)+1 = 4,我想得到 5,因为这是下一行 id。

我会尝试一下我认为你在追求什么。 :)

如果包括 SELECT SCOPE_IDENTITY(); 在您的 SQL 中,您将获得所需的 ID:

INSERT INTO products (
   * your fields *
)
VALUES (
   * your values *
);
SELECT SCOPE_IDENTITY();

然后在您的代码中,您可以拥有:

var Id = Convert.ToInt32(cmd.ExecuteScalar());

这将为您提供插入的记录的 ID。

我怀疑实际的问题是How can I find the ID of the row I just inserted so I can use it as a foreign key in related tables or in an image file name?

SQL Server 自 2005 年起在 INSERT、UPDATE、DELETE 语句中提供了OUTPUT 子句,这些语句返回刚刚插入或修改的列的值。 在插入语句的情况下,语法是:

insert into Products (Product)
OUTPUT inserted.ID 
VALUES ('xxx')

这是比IDENT_CURRENTSCOPE_IDENTITY值更好的选择,因为它使用单个语句返回值,并且返回的内容没有歧义:

  • 如果多个用户在事务外写入表,则IDENT_CURRENT可能返回不同的值
  • SCOPE_IDENTITY返回事务中生成的最后一个 ID,无论表如何

您可以返回多个列:

insert into Products (Product)
OUTPUT inserted.ID, inserted.Product
VALUES ('xxx')

您可以使用 ExecuteScalar 执行此语句,如果您只返回一列或 ExecuteReader,如果您想返回更多列。

在 UPDATE 或 DELETE 语句的情况下, deleted表包含已删除的值, inserted表包含新值

注意像实体框架这样的 ORM 已经使用这样的语句来检索自动生成的 ID 并更新保存的对象。 在这种情况下,只需读取保存对象的 ID 属性。

一种可能的解决方案可能是您不删除行。 您可以添加一个标志并将其设为非活动/删除。 这样您的行号将始终保留,您的代码将为您提供最大 Id。

我认为 OP 试图解决错误的问题......

当您将新产品插入产品表时,您应该尝试直接使用 scope_identity 函数(SQLServer!)检索新 ID:

string sql = "insert into products(name) values('Yellow Cup'); SELECT SCOPE_IDENTITY();";
var sqlCommand = new SqlCommand(sql, conn);
var id = cSqlServer.ExecuteScalar();

在这种情况下,MAX 绝对不是任何人都会使用的。 最接近的解决方案是获取最近使用的标识值,然后将其增加 1(在您的情况下)或种子值,无论它是什么。

select ident_current('products') + 1

注意 - 虽然这暂时解决了您的目的,但请注意 'ident_current' 也会返回其他会话设置的标识值。 简而言之,如果有一些请求/触发器/执行导致 id 在您的按钮点击完成之前增加,那么您将获得 insert_id 而不是删除一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM