更新某些行时忽略唯一键(mariadb)

mpbci0fu  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我有下表(mariadb):

+----+--------------+-------------+-------------+
| id | content_type | sort_number | document_id |
+----+--------------+-------------+-------------+
|  1 | text         |           1 |           1 |
|  2 | table        |           2 |           1 |
|  3 | text         |           3 |           1 |
|  4 | image        |           4 |           1 |
+----+--------------+-------------+-------------+

组合 sort_number 以及 document_id 是独一无二的。
现在,当我想在位置2添加一个新条目时,我需要增加 sort_number 在所有条目中 sort_number >= 2 一步到位。
为此,我使用以下查询:

update `table_name` set `sort_number` = sort_number +1 where `sort_number` > ? and `document_id` = ?

但因为有唯一的钥匙( sort_number 以及 document_id )我得到一个错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3' for key 'table_name_sort_number_document_id_unique'

我努力避免犯错误 SET unique_checks=0; 但还是得到了错误。。。
有没有更好的方法来更新 sort_number 在一个查询中?

li9yvcax

li9yvcax1#

我喜欢保罗·斯皮格尔提供的解决方案。我的查询现在如下所示:

update `table_name` set `sort_number` = sort_number +1 where `sort_number` > ? and `document_id` = ? order by `sort_number` desc
gorkyyrv

gorkyyrv2#

order by也适用于更新查询,因此只需执行以下操作:

SET @i:=0;
UPDATE items SET disp_order=@i:=@i+1 ORDER BY item_name;

只需从最后一行开始更新并向后遍历即可。

相关问题