我有一個以下格式的(MYSQL)表;假設表的名稱是 mytable
:
id | 姓名 | 群組 |
---|---|---|
123 | 名稱1 | 1 |
124 | 名稱2 | 2 |
125 | 名稱3 | 1 |
126 | 名稱4 |
id
是唯一的並且自動遞增。 name
是一個唯一的字串,group
只是一個整數
我現在想將name4
指派給一個尚不存在的新group
,因此本例中name4
的group
不能是1
或2
。
例如,結果可能是:
id | 姓名 | 群組 |
---|---|---|
126 | 名稱4 | 3 |
目前,我按 group
降序排序,只需手動插入最大數字 1,但我想知道是否有更好/更快的方法在列中產生新的唯一值。 group
除了是一個整數之外沒有其他約束。
我正在使用 MySQL Workbench,因此我可以使用 SQL 命令以及特定於 Workbench 的選項(如果有)。
如果有任何不清楚的地方,我很樂意提供說明。
P粉2054755382023-09-17 00:08:56
在 MySQL 8.0 中,您可以獲得兩個視窗函數的協助:
MAX
,檢索最大「group」值ROW_NUMBER
,檢索表中存在的每個 NULL 的增量值。 然後,您可以對這兩個值求和並更新「群組」欄位為空的表。
WITH cte AS ( SELECT id, name, MAX(group_) OVER() + ROW_NUMBER() OVER(PARTITION BY group_ IS NULL ORDER BY name) AS new_group FROM tab ) UPDATE tab INNER JOIN cte ON tab.id = cte.id AND tab.name = cte.name SET tab.group_ = cte.new_group WHERE tab.group_ IS NULL;
請在此處查看示範。
在 MySQL 5.X 中,您可以使用一個變量,用最大的「group」值初始化,然後在 UPDATE
語句中增量更新。 >SET 子句。
SET @maxgroup = NULL; SELECT MAX(group_) INTO @maxgroup FROM tab; UPDATE tab SET group_ = (@maxgroup:= @maxgroup + 1) WHERE group_ IS NULL; ORDER BY id;
請在此處查看示範。