2017-06-23 38 views
1

我試圖在MySQL Workbench的表中添加第new_id列,但我希望這個new_id是GROUP BY old_idMySQL:如何將新的id列添加到表中,按舊列分組?

我試了下面的代碼。 new_id是自動增加,但它不是由old_id組。

ALTER TABLE candidate 
ADD COLUMN new_id int not null auto_increment UNIQUE FIRST, 
ADD PRIMARY KEY(old_id, new_id); 

下面是我的了:

+----------+--------+ 
| old_id | new_id | 
+----------+--------+ 
| 00132004 | 1 | 
| 00132004 | 2 | 
| 00132004 | 3 | 
| 00132004 | 4 | 
| 00118685 | 5 | 
| 00118685 | 6 | 
| J99999 | 7 | 
| J99999 | 8 | 
| J99988 | 9 | 
| J99987 | 10 | 
+----------+--------+ 

但是,這是我得到:

+----------+--------+ 
| old_id | new_id | 
+----------+--------+ 
| 00132004 | 1 | 
| 00132004 | 1 | 
| 00132004 | 1 | 
| 00132004 | 1 | 
| 00118685 | 2 | 
| 00118685 | 2 | 
| J99999 | 3 | 
| J99999 | 3 | 
| J99988 | 4 | 
| J99987 | 5 | 
+----------+--------+ 

缺少什麼我在這裏......? 謝謝!!!

+1

的自動遞增列會爲每個新記錄的新值。它不會(也不應該)生成一個值複製不同行中的值。如果你真的需要這樣的東西,你將不得不在創建插入觸發器之前創建一個值並將其放入列中。 –

+0

每行增加自動增量。你不能改變這一點。如果你想要一個自動遞增的非唯一ID,你可能必須爲它編寫一個自定義函數。 – serakfalcon

回答

0

new_id您的新要求,將無法正常工作使該列自動遞增,因爲那時這些值將不會是唯一的或增量。

你在找什麼叫做密集排名。 MySQL沒有內置該支持,但你可以使用會話變量,模擬它:

SET @dense_rank = 0; 
SET @old_id = NULL; 

SELECT 
    @dense_rank:=CASE WHEN @old_id = old_id 
         THEN @dense_rank ELSE @dense_rank + 1 END AS dr, 
    @old_id:=old_id AS old_id, 
    new_id 
FROM candidate 
ORDER BY new_id 

注意,因爲MySQL不支持自動爲保持密集秩任何清潔方式,SELECT查詢可能是你的最好的長期選擇。這樣,您可以隨時根據最新數據計算密集等級,而無需擔心將其保留在實際表中。

輸出:

enter image description here

演示在這裏:

Rextester

0

你想(可惜)不能用自動增量列來完成。

另一種解決方案可能是:

CREATE TABLE mytab (new_id int not null auto_increment, 
old_id VARCHAR(200), 
FOREIGN KEY old_id (old_id) REFERENCES candidate(old_id)); 

CREATE UNIQUE INDEX old_id_idx ON mytab(old_id); 

這保證了獨特的old_ids,讓您在返回唯一NEW_ID。你現在可以用INNER JOIN加入這個new_id對候選表,並得到你想要的結果。

0

添加列,然後使用update設置:

set @old_id = '', @rn = 0; 

update candidate 
    set new_id = if(@old_id = old_id, @rn, 
        if(@old_id := old_id, @rn := @rn + 1, @rn := @rn + 1) 
        ) 
    order by old_id; 
+0

Gordon,如果將_new_數據添加到表中,這可能會變得繁重,因爲我們必須每次(可能)都運行此更新。 –

相關問題