如何在sql中关闭自动编号?

时间:2012-01-26 22:28:48

标签: sql sql-server primary-key autonumber

我陷入两难境地。我有一个名为ID的列表,它是主键。它是自动增量,如1,2,3等,表格为1-8。

前程序员删除了第7行,所以现在有6到8之间的差距。我需要将8的值更改为7.

我尝试了几件事:

  • 我无法编辑ID 8,因为它是一个标识列

  • 我试过查询:

    设置identity_insert mytable ON

然后删除该行并重新添加和编辑其他线程建议的ID。但是,自动编号开始了,现在是第9行,我仍然无法编辑ID。我不确定我在这里做错了什么。有没有办法做到这一点?提前致谢。

5 个答案:

答案 0 :(得分:2)

你可能需要问为什么重要的是数字是顺序的而没有间隙:SQL的IDENTITY类型并不是真正用于你发现的这种功能。

那就是说,如果你确实需要填补空白,那么你几乎就在那里 - 你需要做的另一件事是用一个新的起始编号重新设置身份字段。在SQL Server中,这是通过DBCC CHECKIDENT实现的。

不要把它作为一个程序化的东西来解雇 - 只有当你需要清理数据时这应该是一个DBA任务,而且在实践中这是相当罕见的(十年后,我只有曾经使用过它。这是在一个开发数据库上;它从未在现场环境中使用过)。如果您发现您正在定期重新种植,那么您需要重新考虑该应用程序的行为。

答案 1 :(得分:1)

没有人真正回答过这个问题:“如何在sql中关闭自动编号?”

当我将整数字段更改为autonum时,PhpMyAmin显示以下SQL ...

ALTER TABLE course CHANGE Test Test INT(11)NOT NULL AUTO_INCREMENT

..当我删除autonum时...

ALTER TABLE course CHANGE Test Test INT(11)NOT NULL

在MS ACCESS SQL中我使用了

ALTER TABLE课程ALTER Record_ID INTEGER; 关闭自动编号。

如果你重新打开自动编号,你会发现它恢复了你的最后一个号码。 要将自动编号重置为1,您需要重新播种它(并且您的表应为空)

也许这会帮助下一个人来到这里。

答案 2 :(得分:0)

尝试找到缺失的空白并使用该ID插入。这可能证明是有用的,并且很好地解释了http://www.codediesel.com/mysql/sequence-gaps-in-mysql/

答案 3 :(得分:0)

  

我不确定我在这里做错了什么。

您正在使用IDENTITY来表示其他用途。

正如其他人在评论中所说的那样,IDENTITY的目的是创建唯一数字,而不是漂亮的数字。
如果您需要漂亮的数字,那么IDENTITY列就是错误的工具。您应该创建第二个(非标识)列,并使用其他方法生成漂亮的数字。

一般来说,更改主键的价值几乎绝不是一个好主意(无论它是IDENTITY列还是只是#34;常规&#34 ;主键)。

想想这些情景:

  • 如果有其他表格引用您正在更改的表格,您会怎么做? 您必须找到使用该值的所有其他表格,并在那里进行更改 (考虑一个带有Products的{​​{1}}表格,以及一个使用相同ProductId的{​​{1}}表格

  • 当数据库中已有100,000条记录而然后有人删除第7行时,您会怎么做?将第8行中的值更改为100,000?

  • 然后,假设删除了第10行100,000,该列被其他表引用。

  • 你真的想这样做每次有人删除一行吗?

你知道,微软的人有一个原因,他们决定不允许编辑Orders值 你不想这样做......相信我!

答案 4 :(得分:0)

有适用的情况(但数据库设计很差/不足),这是适用的。

E.g。一个行数较少的表,但通过ID非常快速地向上移动。你可以点击整数max + ve值。

短期修复可以重新生成ID。长期是阻止快速ID种子移动或使用更好的密钥数据类型。