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