我有一个表,在两列上有唯一索引,准确地说是 id_parent 和 sort_order
+----+-----------+------------+-------------+-------------+-------------+
| id | id_parent | sort_order | some_data | other_data | more_data |
+----+-----------+------------+-------------+-------------+-------------+
| 1 | 1 | 1 | lorem ipsum | lorem ipsum | lorem ipsum |
| 2 | 1 | 2 | lorem ipsum | lorem ipsum | lorem ipsum |
| 3 | 1 | 3 | lorem ipsum | lorem ipsum | lorem ipsum |
+----+-----------+------------+-------------+-------------+-------------+
现在我想一次性更新它们、它们的数据和它们的 sort_order。 sort_order 将从 1 - 2 - 3
更改为例如 2 - 3 - 1
。
但是当我开始运行更新语句时,唯一索引阻止了我,正如预期的那样,说我不能有两行 id_parent = 1 和 sort_order = 2
。
好吧,我现在可以将它设置为 4,以正确的顺序更新其他行,然后再设置这一行。
但是,我将不得不运行一个额外的语句,并且很可能向我的脚本语言添加额外的逻辑以确定正确的更新顺序。
我也用ORM,越来越不方便。
我现在的问题是,有什么方法可以让mysql暂时忽略这个索引吗?就像启动一个特殊的事务,其中的索引只会在提交之前计算?
最佳答案
据我所知,这是不可能的。
我唯一见过这样的事情是您可以禁用 myisam 表上的非唯一键。但不在 InnoDB 上,也不在唯一键上。
但是,为了节省一两次更新,不需要确切的数字 1、2 和 3。您也可以拥有 4、5 和 6。对吗?您将按顺序使用它,而不是其他任何东西,因此确切的数字并不重要。如果您很聪明,它甚至可以为您保存更新。从你的例子中
update table set sort_order = 4 where sort_order = 1 and id = 1 and id_parent = 1;
新的排序顺序是 2、3、1。只需一次更新。
关于Mysql暂时抑制唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8410844/