我有一个在两列上有唯一索引的表,准确地说是 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 and sort_order = 2
。
好吧,我现在可以将其设置为 4,以正确的顺序更新其他行,然后设置这一行。
但是,然后,我必须运行额外的语句,并且很可能向我的脚本语言添加额外的逻辑来确定正确的更新顺序。
我也用ORM,就更不方便了。
我现在的问题是,有什么方法可以让mysql暂时忽略这个索引吗?就像启动一个特殊的事务一样,其中的索引只会在提交之前计算?
据我所知这是不可能的。
我唯一一次看到类似的情况是您可以禁用 myisam 表上的非唯一键。但不是在 InnoDB 上,也不是在唯一键上。
然而,为了节省一两个更新,不需要有确切的数字 1、2 和 3。您也可以有 4、5 和 6。对吧?您将在 order by 中使用它,而不是其他任何东西,因此确切的数字并不重要。如果你聪明的话,它甚至可以为你保存更新。从你的例子来看
update table set sort_order = 4 where sort_order = 1 and id = 1 and id_parent = 1;
新的排序顺序是 2, 3, 1。并且仅在一次更新中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)