我有下表(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
吗?
答案 0 :(得分:0)
ORDER BY也适用于更新查询,因此很简单:
SET @i:=0;
UPDATE items SET disp_order=@i:=@i+1 ORDER BY item_name;
只需从最后一行开始更新,然后向后遍历即可。
答案 1 :(得分:0)
我喜欢Paul Spiegel提供的解决方案。我的查询现在看起来像这样:
update `table_name` set `sort_number` = sort_number +1 where `sort_number` > ? and `document_id` = ? order by `sort_number` desc