我有一个如下所示的 MySQL 表:
我想进行更改,使 id 为 15(女性、连衣裙)的条目现在的主键为 8,然后其他的被移动一个,例如,现在的 Kids Tops 将是 9,等等。有没有简单的方法来通过 phpmyadmin 或 SQL 查询执行此操作?此外,因为 id 15 已经在其他地方用作外键,所以我希望此更改能够在其他表中的所有位置反映出来。
我有一个如下所示的 MySQL 表:
我想进行更改,使 id 为 15(女性、连衣裙)的条目现在的主键为 8,然后其他的被移动一个,例如,现在的 Kids Tops 将是 9,等等。有没有简单的方法来通过 phpmyadmin 或 SQL 查询执行此操作?此外,因为 id 15 已经在其他地方用作外键,所以我希望此更改能够在其他表中的所有位置反映出来。
一个人不应该改变主键 - 永远。此外,将 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
您不能更改“主键”,这是有充分理由的。其他表很可能使用主键来引用特定行。因此,更改不会在表中是本地的,它必须在每个引用表中。
如果要更改列中的值,则必须首先删除主键约束。
如果你真的必须做这样的事情,这里有一些注意事项:
on delete cascade
)。(我必须承认我可能错过了一些东西,因为这不是我永远不会做的事情。)
更改主键,尤其是用于外键关系的主键,不应掉以轻心。此类密钥的目的是维护关系完整性。您不应该为键中的空白或缺乏顺序而烦恼。如果您想要一个序列号,您可以将其添加到另一列中。
也许您应该使用 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;