如何在sql中关闭自动编号?
我左右为难。我有一个名为ID的列的表,它是主键。它是自动递增的,所以1、2、3等等,表格是1-8 一位以前的程序员删除了第7行,所以现在第6行和第8行之间有一个间隙。我需要将8的值改为7 我试过几种方法:如何在sql中关闭自动编号?,sql,sql-server,primary-key,autonumber,Sql,Sql Server,Primary Key,Autonumber,我左右为难。我有一个名为ID的列的表,它是主键。它是自动递增的,所以1、2、3等等,表格是1-8 一位以前的程序员删除了第7行,所以现在第6行和第8行之间有一个间隙。我需要将8的值改为7 我试过几种方法: 我无法编辑ID 8,因为它是标识列 我试图提出以下问题: 设置标识\u在上插入mytable 然后删除该行,并按照其他线程的建议重新添加和编辑ID。然而,自动编号开始了,现在是第9行,我仍然无法编辑ID。我不确定我在这里做错了什么。有办法做到这一点吗?提前谢谢 尝试找到缺失的间隙并使用该I
- 我无法编辑ID 8,因为它是标识列
- 我试图提出以下问题: 设置标识\u在上插入mytable
然后删除该行,并按照其他线程的建议重新添加和编辑ID。然而,自动编号开始了,现在是第9行,我仍然无法编辑ID。我不确定我在这里做错了什么。有办法做到这一点吗?提前谢谢 尝试找到缺失的间隙并使用该ID进行插入。这可能很有用,并且解释得很好您可能需要问,为什么数字是连续的,没有间隙很重要:SQL的
标识
类型实际上不适合您所发现的这种功能
这就是说,如果您确实需要填补中的空白,您就快到了--您需要做的另一件事是在标识字段中重新设置一个新的起始编号。在SQL Server中,这是通过以下方法实现的
但不要让它成为一个编程的东西——这应该是一个DBA任务,只有当您需要清理数据时,这在实践中是相当罕见的(在十年中,我只使用过一次。这是在开发人员数据库上使用的;它从未在实际环境中使用过)。如果您发现您正在定期重新播种,那么您需要重新考虑应用程序的行为
我不确定我在这里做错了什么
您正在使用IDENTITY
进行其他用途
正如其他人在我之前的评论中所说的那样,IDENTITY
的目的是创建独特的数字,而不是漂亮的数字。如果你需要漂亮的数字,
IDENTITY
列是错误的工具。您应该创建第二个(非标识)列,并使用其他方法生成漂亮的数字
一般来说,更改主键的值几乎从来都不是一个好主意(不管它是标识列还是“常规”主键)
想想这些场景:
- 当有其他表引用您正在更改的表时,您会怎么做?
您必须找到使用该值的所有其他表,并在其中进行更改。
(设想一个产品
表和一个产品ID
,再加上一个订单
表,该表也使用相同的产品ID
)
- 当数据库中已有100000条记录,然后有人删除了第7行时,您会怎么做?是否将第8行中的值更改为100000
- 然后,假设100000行中的第7行被删除,并且该列被其他表引用
- 你真的想每次有人删除一行时都这样做吗
你看,微软的人决定不允许编辑IDENTITY
值是有原因的。
你不想这么做…相信我 实际上没有人回答这个问题:“如何在sql中关闭自动编号?”
当我将整型字段更改为自动编号时,PhpMyAmin显示以下SQL
更改表格课程
更改测试
测试
INT(11)非空自动增量
…当我移除自动编号时
更改表格课程
更改测试
测试
INT(11)不为空
在MS ACCESS中,我使用了SQL
ALTER TABLE course ALTER Record_ID INTEGER;
关闭自动号码
如果你重新打开自动号码,你会发现它会恢复到你的上一个号码。
要将自动编号重置为1,您需要对其重新设定种子(并且您的表应为空)
也许这将有助于下一个在这里着陆的人。在适用的情况下,存在有效的案例(但数据库设计较差/不足)
例如,行数较低但在ID中向上移动非常快的表。您可以点击整数max+ve值
短期修复方法是重新设置ID的密钥。从长远来看,要么防止ID种子快速移动,要么使用更好的密钥数据类型。是否有特定的原因使您的ID不能有间隙?主键的值没有任何意义。把它重新编号是完全没有用的。你知道我实际上不知道这是否是个问题。如果代码正在计算ID,那么这可能会导致代码中出现问题吗?@javasocute:如果您的代码依赖于无间隙主键值,那么您的代码是错误的。您只需要习惯标识字段中存在间隙的想法。最终他们总是这样。如果出于某种奇怪的原因,你需要它们是绝对连续的,那么你使用的工具是错误的。