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

Posted

技术标签:

【中文标题】更改表中一行的主键(id)并将其他行向下移动【英文标题】:Change primary key (id) of a row in a table and shift the others downwards 【发布时间】:2013-06-15 10:40:37 【问题描述】:

我有一个如下所示的 mysql 表:

我想进行更改,使 id 为 15(女性、连衣裙)的条目现在的主键为 8,然后将其他条目移动 1,例如,Kids Tops 现在将为 9,等等。是否有通过 phpmyadmin 或 SQL 查询的简单方法?此外,因为 id 15 已经在其他地方用作外键,所以我希望此更改能够在其他表中的所有位置反映出来。

【问题讨论】:

。 .不要更改主键。它被使用的事实强调了为什么你不应该改变它。 @GordonLinoff 如果我必须这样做怎么办? SET foreign_key_checks = 0; <run all the update careful queries>; SET foreign_key_checks = 1; 【参考方案1】:

永远不要更改主键。此外,将 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

【讨论】:

【参考方案2】:

您不能更改“主键”,这是有充分理由的。其他表很可能使用主键来引用特定行。因此,更改不会在表中是本地的,它必须在每个引用表中。

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

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

    要更改主键的值,您必须先删除主键约束。 删除对表的所有外键引用。否则,您将在更改值时遇到意外错误或意外删除 (on delete cascade)。 创建一个包含旧值和新值的映射表。 更新主表中的值。 更新“外键”引用。 在远程表上重新应用外键约束 对原表重新应用主键约束

(我必须承认我可能错过了什么,因为这不是我永远不会做的事情。)

更改主键,尤其是用于外键关系的主键,不应掉以轻心。此类密钥的目的是维护关系完整性。您不应该为键中的空白或缺乏顺序而烦恼。如果你想要一个序列号,你可以将它添加到另一列中。

【讨论】:

【参考方案3】:

也许您应该使用 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;

【讨论】:

以上是关于更改表中一行的主键(id)并将其他行向下移动的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从表中删除所有行并将 ID 重置为零

MySQL 从表中删除所有行并将 ID 重置为零

在引导表中向上或向下移动行

SQL怎么在有外键的主键表中插数据

更改数据库行的主键值

在excel的宏里面 “向下移动一行” 如何写