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

7
我有一个MySQL表格,看起来像这样: enter image description here 我想要更改这个表格,使得id为15的记录(女装,连衣裙)现在有一个主键为8,然后其他记录都向后移动一位,例如Kids Tops现在将变为9等等。是否有一种简单的方法可以通过phpmyadmin或SQL查询来实现这一点?另外,因为id 15已经被其他表格用作外键,我希望这个更改能够反映在其他表格中。

1
不要更改主键。它被使用的事实强调了为什么你不应该更改它。 - Gordon Linoff
@GordonLinoff 如果我必须怎么办? - adit
1
SET foreign_key_checks = 0; <run all the update careful queries>; SET foreign_key_checks = 1; - E Ciotti
3个回答

5

永远不应该更改主键。此外,将主键视为非数字值可能是有益的。假设您使用自动生成的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

4
您不能更改“主键”,这是有充分理由的。主键很可能被其他表用于引用特定行,因此更改不会局限于表内,而必须在每个引用表中进行更改。
如果要更改列中的值,则必须先删除主键约束。
如果您真的必须这样做,请考虑以下几点:
1. 要更改主键的值,必须首先删除主键约束。
2. 删除所有对该表的外键引用。否则,在更改值时(on delete cascade),您将收到意外错误或意外删除。
3. 创建一个映射表,其中包含旧值和新值。
4. 更新主表中的值。
5. 更新“外键”引用。
6. 在远程表上重新应用外键约束。
7. 在原始表上重新应用主键约束。
(我必须承认,我可能错过了什么,因为这不是我会做的事情。)
更改主键,尤其是用于外键关系的主键,不应轻率对待。这些键的目的是维护关系完整性。您不应对密钥中的间隙或缺乏连续性感到困扰。如果您想要连续编号,可以将其添加到另一列中。

3
也许你应该使用ON UPDATE CASCADE操作修改子表的外键,这样父表的更改就会反映在子表上。
请查看MySQL参考文档中有关FK的内容: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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接