我陷入两难境地。我有一个名为ID的列表,它是主键。它是自动增量,如1,2,3等,表格为1-8。
前程序员删除了第7行,所以现在有6到8之间的差距。我需要将8的值更改为7.
我尝试了几件事:
我无法编辑ID 8,因为它是一个标识列
我试过查询:
设置identity_insert mytable ON
然后删除该行并重新添加和编辑其他线程建议的ID。但是,自动编号开始了,现在是第9行,我仍然无法编辑ID。我不确定我在这里做错了什么。有没有办法做到这一点?提前致谢。
答案 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种子移动或使用更好的密钥数据类型。