Mysql暂时抑制唯一索引

标签 mysql sql indexing sql-update

我有一个表,在两列上有唯一索引,准确地说是 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/

相关文章:

java - Spring 安全: Authentication with Database

php - 循环内的繁重处理 - 如何优化?

sql - 如何在单个 SELECT 查询中获取用户今天和本月的事件计数

mysql - 关于mysql select和update嵌套有数据错误的烦恼

python - 第一次和最后一次出现的逻辑表达式匹配之间的 Numpy 子集数组

mysql - 左连接同一个表但具有不同的值?

mysql 查询多对多关系表 - 'relational divison'?

sql - 如何查找包含给定字符串的存储过程

sql-server - 大表分区——索引

Mysql左连接不使用现有的外键