删除行时修复以下ID

时间:2011-07-05 09:36:00

标签: mysql

我有一个包含一些行的表,每行都有一个唯一的键。从表中删除行时,该行下方的所有行都应“向上移动”。 MySQL中是否有一些内置函数可以执行此操作,还是应该使用PHP或UPDATE table SET id=id-1 WHERE id > deletedid执行此操作?

使用最后一个看起来有点乱。 最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

  1. 你为什么要这样做?我知道在你的唯一ID序列中有漏洞很难看,但是从数据库外部对ID的任何引用无效的缺点通常都要大得多。通常情况是接受序列不会是连续的。如果这些代表一个序列,请考虑按顺序排序,而不是期望N'值具有值N(任何类型的迭代都应该为此用途提供自己的索引)。

  2. 如果值是您自己设置的值,并且您肯定希望将其保持为从1到N(N =“行数”)的值,并且您希望保留值的序列,即使它们不是插入行的顺序,然后“UPDATE table SET id = id-1 WHERE id> deletedid”可能是最好的答案。

  3. 如果值是auto_increment字段,并且您不关心哪些数字与行一起使用,只要每行有一个从1到N的数字,您可以选择执行ALTER TABLE DROP COLUMN'columnname'再次ALTER TABLE再次添加列,数据库将从0重新生成id。(不一定按相同顺序,但通常是。)

  4. 可能有一种方法只能在该点之后重新编号行,但是(根据一个快速的谷歌)它看起来并不像你已经计划的那样容易。

    < / LI>

答案 1 :(得分:2)

首先,您必须确保该列不是任何其他表的外键。

然后你可以试试这个(我不是100%肯定它会起作用):

DELETE FROM 
  MyTable
WHERE 
  id = deletedid;

UPDATE 
  table
SET 
  id=id-1
WHERE 
  id > deletedid
ORDER BY 
  id

如mysql docs中所述:

  

如果指定了ORDER BY子句,   行按照顺序更新   已指定。

以这种方式确保了该领域的独特性。