我有一个包含一些行的表,每行都有一个唯一的键。从表中删除行时,该行下方的所有行都应“向上移动”。 MySQL中是否有一些内置函数可以执行此操作,还是应该使用PHP或UPDATE table SET id=id-1 WHERE id > deletedid
执行此操作?
使用最后一个看起来有点乱。 最好的方法是什么?
答案 0 :(得分:2)
你为什么要这样做?我知道在你的唯一ID序列中有漏洞很难看,但是从数据库外部对ID的任何引用无效的缺点通常都要大得多。通常情况是接受序列不会是连续的。如果这些代表一个序列,请考虑按顺序排序,而不是期望N'值具有值N(任何类型的迭代都应该为此用途提供自己的索引)。
如果值是您自己设置的值,并且您肯定希望将其保持为从1到N(N =“行数”)的值,并且您希望保留值的序列,即使它们不是插入行的顺序,然后“UPDATE table SET id = id-1 WHERE id> deletedid”可能是最好的答案。
如果值是auto_increment字段,并且您不关心哪些数字与行一起使用,只要每行有一个从1到N的数字,您可以选择执行ALTER TABLE DROP COLUMN'columnname'再次ALTER TABLE再次添加列,数据库将从0重新生成id。(不一定按相同顺序,但通常是。)
可能有一种方法只能在该点之后重新编号行,但是(根据一个快速的谷歌)它看起来并不像你已经计划的那样容易。
< / 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子句, 行按照顺序更新 已指定。
以这种方式确保了该领域的独特性。