2012-10-26 58 views
0

我遇到问题。我创建了一个数据库(my_database),在其中创建了一个表(成员),并创建了字段(id,name,lastname,address)。 id字段被设置为自动递增。现在我有5行,这意味着id的值为1,2,3,4和5.当我删除id 3时,剩下的就是'1 2 4 5'。我的问题是我应该怎么做'1 2 4 5'到'1 2 3 4'?任何帮助将非常感激。删除数据后在数据库中使用id字段

更新:我必须这样做,因为我在我的网站上显示所有成员使用循环和访问身份证号码。或者甚至有可能获得数据的ID?示例我有这个数据的数据:id = 2,lastname = clyde,address = switzerland。我怎么才能得到的ID值只是由姓氏值?

+4

什么都不做,这是它应该如何工作。 – JvdBerg

+0

除了在数据库中标识**记录之外,您不应使用_anything_的ID。正因为如此,我们没有理由永远不在乎记录的ID是什么模式,它的顺序是什么,或者其他什么。 **只要给定表中的所有ID都是唯一的(它们将与auto_increment一样),那么**并不重要。 – sgroves

+0

诉诸身份证以符合无用的规则具有良好的序列号是一个巨大的数据完整性洞,而不是说主要的性能杀手。保持原样,auto_increment不会给你连续的数字,你可以用它来稍后显示,它只有一个目的,那就是唯一标识一条记录。 –

回答

0

你可以做一个更新查询,但大多数开发人员只是离开了ID的原样。如果对你很重要,你可以在PHP中进行编号。

0

您可以通过手动将下面的语句更新的值id:

update members set id = (id-1) where id > 3; 

或我的建议是要离开,因为它是。它没有造成任何歧义。

1

你真的不想这么做,原因很多。

首先,如果页面打开,可能会出错。假设用户在id = 4的条目的编辑页面上,那么当您删除id = 3的条目并根据您的建议更新ID时。现在,当编辑人员提交时,ID将从他的页面中取出,他将更新新条目4而不是旧条目4.现在,这是一个直截了当的简单示例,但除此之外,还有更多的东西在这个级别可能会出错。其次,编程时涉及很多工作。首先,你需要更新你的专栏。然后,你还需要确保MySQL知道给出下一个条目的号码。然后,所有这些都必须在一个环境中工作,以确保我们不会在上述问题上遇到很多问题(这非常困难)。与没有做任何事情的选择相比,这是很多工作。

第三个问题是存在巨大的性能开销。想象一下拥有一个拥有成千上万条记录的数据库,然后删除一个低ID的条目。突然间,具有更高ID的所有条目都必须更新。这可能意味着您的网站变得没有响应,因为它正在完成这项任务,并且无法在同一时间处理太多其他事情(事实上,为了确保我们不会像第一点那样遇到问题,我们必须确保我们不会同时做其他任何事情(或者确保我们在不同的数据副本上工作),因为我们可能会在整个更新过程中产生一个结果

我的建议与其他人所说的一致:只要保持原样,不要担心这一点。auto_increment仅用于一个目的:轻松地为每个值赋予唯一的标识符。使用此标识符来标识和引用也许还可以对这些标识符进行排序的情况下,但没有更多的是有一定的顺序(即使这样人们会不同意与此使用它)。

而不是试图更新ID,我们应该寻找另一个地方来解决这个问题。如果问题纯粹是你对此的感受,那很简单。您可能并不感觉良好,但您只需要说服自己,更新所有这些ID不是您正在寻找的解决方案。如果你在其他地方使用数字,这个问题可能会更复杂一些。但是,总是有可能使用PHP为每个条目生成数字,如果数字用于生成HTML内容,那么绝对是这样做的合理位置。如果您提供更多关于使用连续数字的地方的详细信息,那么可以考虑如何解决这种情况。

+0

感谢您的回答,我知道使用id字段不是一个好主意。但我的网站是这样的,我在我的成员页上使用循环显示数据库中的所有成员。现在当我添加一个新成员时,它会自动显示,就像成员列表被更新并且新条目在那里一样。它的工作原理,我已经做到了。现在我的问题是,当我删除一个id = 3的条目,id的序列现在是1 2 4 5.因此,当我重新加载成员页面插槽3是空的,因为它没有找到。 – clydewinux

+1

针对您的迭代问题。在获取之后,不要通过ID进行迭代,而是使用foreach或while等迭代遍历记录集,而不是使用id字段作为索引。 – Ikstar

+0

我很难理解你在这里做什么。如果我没有弄错,只有一个页面列出了一个表中的所有成员,对吧?现在,如果用户被删除,表格将会有一个空行,对吧?那么,如果情况是这样的话,你创建表的策略就不是它应该是的。我不能告诉你如何解决这个问题,除非我知道你现在是怎么做的,但基本的想法不是运行一组数字,而是运行在查询中的所有行上。 – Jasper