Mysql

唯一鍵列的增量值

  • May 24, 2018

我有一張桌子:

CREATE TABLE tbl (
   id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
   rank BIGINT(20) UNSIGNED NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY rank (rank)
)

有一些價值觀:

(2,    11)
(1,    12)
(9,    42)
(4711, 43)
(9000, 44)

即隊伍可能有差距。排名始終 >= 1。

我想從第三個最小值開始將每個等級增加一:

UPDATE tbl table_1
JOIN (
   SELECT table_2.id
   FROM tbl table_2
   ORDER BY table_2.rank ASC
   LIMIT 2, 18446744073709551615
) sub_1 ON table_1.id = sub_1.id
SET table_1.rank = table_1.rank + 1

問題:

#1062 - 鍵 ‘rank’ 的重複條目 ‘43’


我試過的:

  • 添加ORDER BY
UPDATE tbl table_1
JOIN (
   SELECT table_2.id
   FROM tbl table_2
   ORDER BY table_2.rank ASC
   LIMIT 2, 18446744073709551615
) sub_1 ON table_1.id = sub_1.id
SET table_1.rank = table_1.rank + 1
ORDER BY table_1.rank DESC

#1221 - UPDATE 和 ORDER BY 的錯誤使用

  • 消除連接:
UPDATE tbl
SET rank = rank + 1
WHERE rank >= (
   SELECT table_2.rank
   FROM tbl table_2
   ORDER BY table_2.rank ASC
   LIMIT 2, 1
)
ORDER BY rank DESC

#1093 - 表 ’tbl’ 被指定了兩次,既作為 ‘UPDATE’ 的目標,又作為數據的單獨源


我能想到的唯一選擇是要麼省略UNIQUE KEY,要麼將語句分成兩部分:獲得第 3 最低的排名,然後執行UPDATE … ORDER BY …

我的問題有什麼合適的解決方案嗎?


伺服器:MariaDB 10.2.15

InnoDB:5.7.22

我認為您可以執行更新您需要使用 2 個語句。

  1. 按降序更新所有記錄。單表 UPDATE 允許排序。
UPDATE tbl
SET rank=rank+1
ORDER BY rank DESC;
  1. 恢復前 2 條記錄的值。
UPDATE tbl
SET rank=rank-1
ORDER BY rank ASC LIMIT 2;

引用自:https://dba.stackexchange.com/questions/207761