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

如何在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的列的表,它是主键。它是自动递增的,所以1、2、3等等,表格是1-8

一位以前的程序员删除了第7行,所以现在第6行和第8行之间有一个间隙。我需要将8的值改为7

我试过几种方法:

  • 我无法编辑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:如果您的代码依赖于无间隙主键值,那么您的代码是错误的。您只需要习惯标识字段中存在间隙的想法。最终他们总是这样。如果出于某种奇怪的原因,你需要它们是绝对连续的,那么你使用的工具是错误的。