Mysql 更改表中某一行的主键(id),并向下移动其他行

Mysql 更改表中某一行的主键(id),并向下移动其他行,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我有一个MySQL表,如下所示: 我想更改,使id为15(女性,裙子)的条目现在的主键为8,然后将其他条目的主键移动1,例如,现在的儿童上衣将为9,等等。是否有一种简单的方法通过phpmyadmin或SQL查询来实现这一点?另外,由于id 15已在其他地方用作外键,我希望此更改能反映在其他表中的所有位置。任何人都不应更改主键。此外,将PKs视为非数值可能是有益的。假设您将自动生成的guid用于主键 如果要对项目重新编号,则要更改的列应为单独的数字列,并将其显式地视为排序序号。然后,您可以使用三

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


我想更改,使id为15(女性,裙子)的条目现在的主键为8,然后将其他条目的主键移动1,例如,现在的儿童上衣将为9,等等。是否有一种简单的方法通过phpmyadmin或SQL查询来实现这一点?另外,由于id 15已在其他地方用作外键,我希望此更改能反映在其他表中的所有位置。

任何人都不应更改主键。此外,将PKs视为非数值可能是有益的。假设您将自动生成的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
您不能更改“主键”,这是有充分理由的。其他表可能会使用主键引用特定行。因此,更改在表中不是本地的,它必须在每个引用表中

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

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

  • 要更改主键的值,必须先删除主键约束
  • 删除表的所有外键引用。否则,当您更改值时,您将收到意外错误或意外删除(
    关于删除级联
  • 创建一个包含旧值和新值的映射表
  • 更新主表中的值
  • 更新“外键”引用
  • 在远程表上重新应用外键约束
  • 在原始表上重新应用主键约束
  • (我必须承认,我可能错过了一些东西,因为这是我永远不会做的事情。)


    更改主键,尤其是外键关系中使用的主键,不应掉以轻心。这些键的目的是维护关系完整性。您不应该为键中的空白或缺少顺序而烦恼。如果需要序列号,可以将其添加到另一列。

    也许应该使用更新级联操作更改子表FK,以便父表上的更改反映在子表上

    请参阅MySQL参考以了解FK:

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

    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;
    

    . . 不要更改主键。它被使用的事实强调了为什么你不应该更改它。@GordonLinoff如果我不得不这样做怎么办?
    设置外键检查=0;设置外键检查=1