如果[Column Name]是自动增量int类型,则SELECT MAX([Column Name])似乎从已删除的记录中返回值

时间:2010-11-10 10:57:12

标签: sql sql-server

在SQL Server或其他数据库中,如果列是自动增量int类型,即使记录已被删除,表也能记住最高值。但是假设您有一个表,其中包含一些先前已删除的记录,然后如果使用SELECT MAX([ColumnName]),它可能会返回与已删除记录关联的值。有没有人见过这样的场景?

4 个答案:

答案 0 :(得分:5)

在Sql Server中SELECT MAX,可从下面的脚本中看到)不会发生这种情况。

CREATE TABLE TEST_TABLE (
        ID INT IDENTITY (1,1),
        Val INT
)

INSERT INTO TEST_TABLE (Val) SELECT 1
INSERT INTO TEST_TABLE (Val) SELECT 2
INSERT INTO TEST_TABLE (Val) SELECT 3
INSERT INTO TEST_TABLE (Val) SELECT 4
INSERT INTO TEST_TABLE (Val) SELECT 5

DELETE FROM TEST_TABLE WHERE Val >= 3

SELECT  MAX(ID) MaxID
FROM    TEST_TABLE

DROP TABLE TEST_TABLE

输出

MaxID
2

如果您正在寻找表格标识值,请参阅@AdaTheDev答案。

答案 1 :(得分:3)

是的,这是设计的。删除记录时不会重新分配使用的IDENTITY值。 要获取分配的最后一个标识值,您需要使用IDENT_CURRENT,其中(引用)

  

返回为指定表或视图生成的最后一个标识值。生成的最后一个标识值可以用于任何会话和任何范围。

e.g。

SELECT IDENT_CURRENT('TableName')

答案 2 :(得分:2)

我会说如果你在身份/自动增量列上使用MAX(),那么你做错了。

正如@astander所说,这不是我在SQL Server下观察到的行为。

您应该将这些标识符视为不透明 - 它们恰好被构造为整数只是一种方便,具有众所周知的存储要求,群集行为等。

答案 3 :(得分:0)

它是开发人员(不是系统管理员或DBA的) - 不要在生产中这样做!

检查下一个ID是什么:

  DBCC CHECKIDENT ('YourTableName', NORESEED)

请注意,您的下一个ID将是@ MaxID + 1:

  DECLARE @MaxID INT;  
  SELECT @MaxID = COUNT(ID) FROM YourTableName;  
  DBCC CHECKIDENT('YourTableName', RESEED, @MaxID);