我陷入了进退两难的境地。我有一个表,它有一个名为ID的列,它是主键。它是自动递增的,所以1、2、3等等,表格是1-8。
一位前程序员删除了第7行,所以现在有一个介于6和8之间的间隙。我需要将值8更改为7。
我试过几种方法:
-
我无法编辑ID 8,因为它是一个身份列
-
我已尝试查询:
在上设置identity_insert mytable
然后删除该行,并按照其他线程的建议重新添加和编辑ID。然而,自动编号开始了,现在是第9行,我仍然无法编辑ID。我不确定我在这里做错了什么。有办法做到这一点吗?提前感谢。
您可能需要问为什么数字是连续的,没有间隔很重要:正如您所发现的,SQL的IDENTITY
类型并不适合这类功能。
也就是说,如果你确实需要填补空白,你就快到了——你需要做的另一件事是用一个新的起始数字重新设定身份字段。在SQL Server中,这是通过DBCC CHECKIDENT
实现的。
不过,不要把它作为一个程序化的东西来启动——只有当你需要清理数据时,这才应该是一项DBA任务,而且在实践中这是相当罕见的(十年来,我只使用过一次。那是在开发数据库上;它从未在实时环境中使用过)。如果你发现你定期补种,那么你需要重新思考应用程序的行为。
实际上没有人回答这个问题:"如何关闭sql中的自动编号?"
PhpMyAmin在我将整数字段更改为autonum时显示以下SQL。。。
ALTER TABLE course
CHANGE Test
Test
INT(11)NOT NULL AUTO_INCREMENT
当我移除autonum时。。。
更改表course
更改Test
Test
INT(11)不为空
在MS ACCESS SQL中,我使用了
ALTER TABLE课程ALTER Record_ID INTEGER;关闭自动编号。
如果你重新打开自动号码,你会发现它会恢复你的最后一个号码。要将自动编号重置为1,您需要重新设置它的种子(并且您的表应该是空的)
也许这会帮助下一个来到这里的人。
尝试找到缺失的间隙并使用该ID插入。这可能很有用,而且解释得很好http://www.codediesel.com/mysql/sequence-gaps-in-mysql/
我不确定我在这里做错了什么。
您正在将IDENTITY
用于其他用途。
正如在我之前的其他人在评论中所说,IDENTITY
的目的是创建唯一的数字,而不是好看的果你需要漂亮的数字,IDENTITY
列是错误的工具。您应该创建第二个(非标识)列,并使用其他方法生成漂亮的数字。
一般来说,更改主键的值几乎从来都不是一个好主意(无论它是IDENTITY
列还是只是一个"常规"主键)。
想想这些场景:
-
当有其他表引用您正在更改的表时,您该怎么办
您必须找到使用该值的所有其他表,并在那里进行更改
(想想一个带有ProductId
的Products
表,再加上一个使用相同ProductId
的Orders
表) -
当数据库中已经有100000条记录,然后有人删除第7行时,该怎么办?将第8行中的值更改为100000?
-
然后,假设100000中的第7行被删除,并且该列被其他表引用。
-
您真的希望每次有人删除一行时都执行此操作吗?
你看,微软的人决定不允许编辑IDENTITY
值是有原因的
你不想这样做。。。相信我!
这是适用的,有一些有效的情况(但DB设计较差/有缺陷)。
例如,一个行数较低但通过ID向上移动速度极快的表。您可以达到整数max+ve值。
短期解决方案可以是重新设置ID的密钥。长期是为了防止ID种子快速移动,或者使用更好的密钥数据类型。