如何在sql中关闭自动编号



我陷入了进退两难的境地。我有一个表,它有一个名为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列还是只是一个"常规"主键)。

想想这些场景:

  • 当有其他表引用您正在更改的表时,您该怎么办
    您必须找到使用该值的所有其他表,并在那里进行更改
    (想想一个带有ProductIdProducts表,再加上一个使用相同ProductIdOrders表)

  • 当数据库中已经有100000条记录,然后有人删除第7行时,该怎么办?将第8行中的值更改为100000?

  • 然后,假设100000中的第7行被删除,并且该列被其他表引用。

  • 您真的希望每次有人删除一行时都执行此操作吗?

你看,微软的人决定不允许编辑IDENTITY值是有原因的
你不想这样做。。。相信我!

这是适用的,有一些有效的情况(但DB设计较差/有缺陷)。

例如,一个行数较低但通过ID向上移动速度极快的表。您可以达到整数max+ve值。

短期解决方案可以是重新设置ID的密钥。长期是为了防止ID种子快速移动,或者使用更好的密钥数据类型。

相关内容

  • 没有找到相关文章

最新更新