2015-04-25 24 views
2

我有一个表设置了一个自动增加的ID。 可以说我有ID 1,2,3,4和5.当我删除I​​D号3时,我希望ID 4降到3,ID 5降到4.MySql自适应ID

这是可能的?这是如何完成的?

+2

你不应该这样做,如果你添加另一个表的行与这个表的ID相链接的话?留下他们吧。 – jeroen

+1

你为什么要这样?更改现有数据的ID可能会导致更多问题 –

+1

@jeroen我需要摆脱ID之间的空格。 – user3649604

回答

4

我想你要保持你的记录ID,以便与不希望他们之间的任何孔:)

这当然是可能的,但你应该让自己远离这样的解决方案。如果你稍后开始将你的表格彼此关联起来,那么你会后悔这个想法并疯狂地追踪所有表格的外部ID。

真的,它真的不是记录之间有漏洞的坏事。另外,这就是实际的数据库逻辑的工作原理。当使用ID时,就完成了。你不会再使用它。当它不在那里时,你会明白它已经消失了。为此,数据库会跟踪上次使用的号码(对于ID列),并自动递增不是最后一个现有记录的ID,而是上次使用的记录的ID。

总之,你可以。但你不会想要它。

我故意没有解释它是如何完成的。在此之前,要确保OP真正想要的是什么。

至于OP的评论It is what I really want :) There will be no other tables connected to it.我可以想到一个简单的解决方案,不需要任何数据库交互,因为OP现在负责。

创建没有自动递增ID字段的表格。你的ID字段应该是int类型的。在创建记录时,通过订购ID desc(从大到小)从表中获取最后一个ID,并从中获取TOP 1。针对您的请求的示例查询:

SELECT TOP 1 ID FROM Table ORDER BY ID DESC 

在新的INSERT查询中使用结果+ 1。

当您删除一个值时,您应该遍历所有记录并在for循环中逐个更新其ID。这意味着,如果您有成千上万的记录,并且不使用数据库系统的内部功能(在这里您不能使用自己的逻辑),则可能需要一段时间(您已被警告!)。也就是说,如果你与其他桌子没有任何关系。如果这样做,则必须重复该相关表的迭代,以便保持外部标识关系(不再由数据库维护)。因为,通过藐视DB的内在逻辑,你将控制权交给了你的手,现在你有责任追踪和修改你自己的一切。我有没有提到您不能在任何相关表中使用标识列,因为它不会让您将标识更改为其相关表中不存在的标识?

正如你所看到的,这是一个你应该避免的痛苦的过程。在你理解真正发生的事情之前,有些事情可能根本就没有意义。但相信我,我们都曾经在那里。这些系统是在逻辑背后建立起来的。没有必要重新发明轮子。当有人告诉你不要去那里时,你真的可能想要考虑它。 :)

祝你好运!

编辑:当删除你的记录,你应该使用服务器端代码来获取和更新每一行。这是逻辑。获取表格行的总数。在循环外创建一个全局变量,并在循环内计算你的请求增加一个。开始循环(它有你的行的总数的长度)。您从底部开始(从ID为1的第一行开始)。如果您的获取请求中存在空结果,请控制每一行。如果有空,则跳过并下一步。直到你找到真实的记录。当你得到它时,立即使用你在循环外部创建的全局变量来更新它的ID,方法是向你的数据库发送一个INSERT查询。你的循环将完成每一行逻辑,并完成。

我从来没有写过这样的详细的答案,这将不会帮助任何人,但OP。但你很幸运。仔细阅读,不要忘记,从现在开始,你是独立的。

+1

这是我真正想要的:)将不会有其他表连接到它。 – user3649604

+1

最后警告!你真的不想要:) – ilter

+1

我真的会:) – user3649604

2

人们可以将您的任务视为一个简单的计数器列向上计数。

如果这是真的,想象一下表items

realID | field_x | field_y 
-------+----------+-------- 
1001 | bla  | blubb 
1003 | bla2 | blubb2 
1004 |  bla+ | blubbs 

现在看这个:

select count(i2.realId) as counter, i1.field_x, i1.field_y 
from items i1 left join items i2 on i2.realID <= i1.realID 

结果是:

counter | field_x | field_y 
--------+---------+-------- 
    1  | bla | blubb 
    2  | bla2 | blubb2 
    3  | bla+ | blubbs 

我没有检查错别字左右,但结构肯定会奏效。我们的想法是将表加入自己,所有记录的计数方式与表中相应的记录相比,ID小于或等于ID。这就是为什么它在增加。

像这样,你的专栏只是虚拟的,你不必“重新计算”。如果您需要更长久,可以将记录存储在临时中间表中。

但是,无论何时使用join中的范围,都要非常小心,并期望出现性能问题。

+0

感谢您的答案。有趣的方法。 – ilter