更改表中行的主键(id)并将其他行向下移动

时间:2013-06-19 02:39:09

标签: mysql sql phpmyadmin

我有一个MySQL表,如下所示:

enter image description here

我想改变这样,id为15(女装,连衣裙)的条目现在有一个主键为8,然后其他一个被移动一个,所以例如Kids Tops现在将是9,等等。有没有通过phpmyadmin或SQL查询这么简单的方法吗?另外因为id 15已被用作其他地方的外键,我希望这个更改能够反映在其他表中的所有地方。

3 个答案:

答案 0 :(得分:3)

永远不应该改变主键。此外,将PK视为非数值可能是有益的。想象一下,您为主键使用自动生成的GUID。

如果要重新编号项目,则要更改的列应该是单独的数字列,您可以将其明确视为排序的序列号。然后,您可以使用三个UPDATE语句执行您想要的操作:

update mytable set sequence = -sequence where sequence = 15 -- hide the original 15
update mytable set sequence = sequence+1 where sequence >= 8
update mytable set sequence = 8 where sequence = -15

答案 1 :(得分:3)

您无法更改“主键”,并且有充分的理由。主键可能被其他表用于引用特定行。因此,表中的更改不会是本地的,它必须位于每个引用表中。

如果要更改列中的值,则必须先删除主键约束。

如果你真的需要这样做,这里有一些注意事项:

  1. 要更改主键的值,必须先删除主键约束。
  2. 删除对表的所有外键引用。否则,当您更改值(on delete cascade)时,您将收到意外错误或意外删除。
  3. 创建具有旧值和新值的映射表。
  4. 更新主表中的值。
  5. 更新“外键”参考。
  6. 在远程表上重新应用外键约束
  7. 在原始表格上重新应用主键约束
  8. (我必须承认我可能错过了一些东西,因为这不是我做过的事情。)

    更改主键,尤其是在外键关系中使用的主键,不应掉以轻心。这些密钥的目的是保持关系完整性。你不应该被关键缺陷或缺乏顺序性所困扰。如果需要序列号,可以将其添加到另一列中。

答案 2 :(得分:1)

也许您应该使用ON UPDATE CASCADE操作更改子表FK,以便父表上的更改反映在子表上。

请参阅FK的MySQL参考:http://dev.mysql.com/doc/refman/5.1/en/create-table-foreign-keys.html

稍后您可以执行以下操作:

UPDATE table SET id = -15 WHERE id = 15;
UPDATE table SET id = id + 1 WHERE id >=8;
UPDATE table SET id = 8 WHERE id = -15;