2010-11-10 28 views

回答

5

这不会SELECT MAX这可以从下面的脚本可以看出)在SQL服务器发生。

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答案。

+0

嗨,我的SQL的知识是有限的,我不能完全理解你的剧本。如何获得现有记录中主键的最大值?由于Select Max()可以返回已删除的记录,因此我无法将其用于此目的。 – Aperture 2010-11-10 11:09:46

+2

它不会返回已删除的记录。这就是这个脚本给你看的东西。 – 2010-11-10 11:11:21

+0

是的,你是对的。 – Aperture 2010-11-10 12:38:48

3

是的,这是设计。删除记录时,不会重新分配使用的IDENTITY值。 得到最后的标识值分配,你需要使用IDENT_CURRENT,这(报价)

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

例如,

SELECT IDENT_CURRENT('TableName') 
2

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

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

你应该把这些标识符作为不透明 - 他们碰巧被构造为一个整数仅仅是一种方便你,与知名的存储需求,集群行为等

0

这是DEV(不是系统管理员的或DBA的)董事会 - 不要在生产中这样做!

要检查什么是下一个ID:

DBCC CHECKIDENT ('YourTableName', NORESEED) 

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

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