在SQL Server或其他数据库中,如果列是自动增量int类型,则表可以记住最大值即使记录已被删除。比方说,你有一个表,其中有一些记录先前被删除,然后你使用SELECT MAX([ColumnName]),它可能会返回一个与删除记录相关联的值。有没有人看过像这样的场景?如果[ColumnName]是自动增量int类型,SELECT MAX([ColumnName])会返回已删除记录的值
2
A
回答
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答案。
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);
相关问题
- 1. SELECT MAX([ColumnName])的结果是否有列名?
- 2. DAX返回的ColumnName作为行值
- 3. SQL SELECT MAX()是返回多个记录
- 4. 是否有可能使Nhibernate查询生成columnName <>'值'而不是(columnName ='value')?)
- 5. SQL SELECT * FROM XXX WHERE columnName in Array
- 6. 使用FK约束SP删除子记录给定TableName,ID ColumnName和ID
- 7. ,柱<columnName>是类型jsonb的但表达的类型是文本的[]
- 8. DataTable.Select(“ColumnName IN”)Guid error
- 9. FluentNHibernate错误与ColumnName?
- 10. DataTable DataColumn ColumnName not displayed
- 11. mysql自动增量 - 记录删除后重新分配
- 12. 获取先前的非空值COLUMNNAME
- 13. 自动扣除类型stdMaxInt = std :: max <int>;
- 14. SELECT MAX返回错误的值
- 15. 错误:<target> .ColumnName和<source> .ColumnName有冲突的属性:数据类型属性不匹配
- 16. 返回记录类型
- 17. 选择行数据作为ColumnName和值
- 18. PHP cookie返回“已删除”作为值
- 19. C#返回int并增加返回值
- 20. AS3 POST返回值'+'已被删除
- 21. 从mysql删除记录,只有select count返回> 0
- 22. 列“ColumnName”不属于表
- 23. 如何获取插入的记录的pkey值(自动增量)?
- 24. MS Access:将已删除的记录自动移动到“回收站”表
- 25. 从表中删除,并返回未删除的记录
- 26. 删除自动增量中的差距
- 27. 如何错误“ColumnName已经属于数据表”?
- 28. 函数返回值的自动类型扣除
- 29. 函数返回记录类型还是什么都不返回?
- 30. 在SQL Server中,not(columnName ='value')和columnName <>'value'有什么区别?
嗨,我的SQL的知识是有限的,我不能完全理解你的剧本。如何获得现有记录中主键的最大值?由于Select Max()可以返回已删除的记录,因此我无法将其用于此目的。 – Aperture 2010-11-10 11:09:46
它不会返回已删除的记录。这就是这个脚本给你看的东西。 – 2010-11-10 11:11:21
是的,你是对的。 – Aperture 2010-11-10 12:38:48