2

我进退两难了。我有一个表,其中有一列名为 ID,它是主键。它是自动增量的,所以 1、2、3 等等,表格是 1-8。

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

我尝试了几件事:

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

  • 我试图查询:

    将 identity_insert mytable 设置为 ON

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

4

5 回答 5

2

您可能需要问为什么数字是连续的没有间隔很重要:SQL 的IDENTITY类型并不真正适合您所发现的这种功能。

也就是说,如果您确实需要填补空白,那么您就快到了——您需要做的另一件事是使用新的起始编号重新设置身份字段。在 SQL Server 中,这是通过DBCC CHECKIDENT.

不要让它成为一个编程的东西——这应该是一个 DBA 任务,只有当你需要清理数据时,它在实践中是相当罕见的(十年来,我只用过一次) .那是在开发数据库上;它从未在实时环境中使用过)。如果您发现自己定期重新播种,那么您需要重新考虑应用程序的行为。

于 2012-01-26T22:36:52.753 回答
1

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

当我将整数字段更改为自动编号时,PhpMyAmin 显示以下 SQL...

ALTER TABLE courseCHANGE Test TestINT(11) NOT NULL AUTO_INCREMENT

..当我删除自动编号时...

ALTER TABLE courseCHANGE Test TestINT(11) 非空

在 MS ACCESS SQL 我使用

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

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

也许这会帮助下一个登陆这里的人。

于 2012-03-12T16:25:05.863 回答
0

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

于 2012-01-26T22:32:11.857 回答
0

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

你正在使用IDENTITY的东西不是它本来应该被使用的东西。

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

通常,更改主键的值几乎从来都不是一个好主意(无论它是IDENTITY列还是“常规”主键)。

想想这些场景:

  • 当有其他表引用您正在更改的表时,您会怎么做?
    您必须找到使用该值的所有其他表并在那里进行更改。
    (想想一个Products带有 的表ProductId,加上一个Orders也使用相同的表ProductId

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

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

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

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

于 2012-01-27T00:26:58.600 回答
0

有适用的有效案例(但不良/有缺陷的数据库设计)。

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

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

于 2014-03-10T01:56:01.130 回答