2017-09-09 40 views
0

我有一個需要複製行的表。該表是這樣的,它有一個主自動遞增鍵以及一個用於將行分組在一起的列。有沒有辦法讓複製一系列行的組ID設置爲從最後一個值增加?複製行和增量列

這是基本的例子,原始表數據

pri | grp 
---------- 
1 | 1 
2 | 9 
3 | 2 
4 | 1 
5 | 2 
6 | 9 
7 | 2 

我的目標是複製行1-7和有這樣的結果:

pri | grp 
---------- 
1 | 1 
2 | 9 
3 | 2 
4 | 1 
5 | 2 
6 | 9 
7 | 2 
- copied - 
8 | 10 
9 | 12 
10 | 11 
11 | 10 
12 | 11 
13 | 12 
14 | 11 

注意所複製的行GRP開始在最初的Max grp之後,然後每增加一個grp就會增加1。

SET @new = (SELECT MAX(grp)+1 FROM tbl), @prev = (SELECT MIN(grp) FROM tbl); 
INSERT INTO tbl (grp) (
SELECT IF([email protected], 
    -- set @prev, use @new 
    , CASE 
     WHEN (@prev:=grp) IS NULL THEN NULL 
     ELSE @new 
    END 
    -- set @prev, update and use @new 
    , CASE 
     WHEN (@prev:=grp) IS NULL THEN NULL 
     ELSE @new:[email protected]+1 
    END) 
FROM tbl 
ORDER BY grp 
) 

這是給我下面的結果,它看起來像@prev變量沒有被正確地更新。

pri | grp 
---------- 
1 | 1 
2 | 9 
3 | 2 
4 | 1 
5 | 2 
6 | 9 
7 | 2 
- copied - 
8 | 10 
9 | 14 
10 | 11 
11 | 10 
12 | 12 
13 | 15 
14 | 13 

回答

0

我認爲你需要分配新GRP在一個子查詢,然後整理成原來的順序

DROP TABLE IF EXISTS Tbl; 
CREATE TABLE Tbl (PRI INT AUTO_INCREMENT PRIMARY KEY, GRP INT); 
INSERT INTO Tbl (pri,grp) VALUES 
(1 , 1), 
(2 , 9), 
(3 , 2), 
(4 , 1), 
(5 , 2), 
(6 , 9), 
(7 , 2); 


INSERT INTO Tbl (grp) 
select s.n 
from 
(
SELECT t.pri tpri,t.grp tgrp 
     ,if(t.grp <> @prev,@new:[email protected]+1,@new) n 
     ,@prev:=t.grp p 
FROM tbl t,(SELECT @new:= (select max(grp) from tbl),@prev:=0) n 
order by t.grp 
) s 
order by s.tpri 
; 

MariaDB [sandbox]> select * from tbl; 
+-----+------+ 
| PRI | GRP | 
+-----+------+ 
| 1 | 1 | 
| 2 | 9 | 
| 3 | 2 | 
| 4 | 1 | 
| 5 | 2 | 
| 6 | 9 | 
| 7 | 2 | 
| 8 | 10 | 
| 9 | 12 | 
| 10 | 11 | 
| 11 | 10 | 
| 12 | 11 | 
| 13 | 12 | 
| 14 | 11 | 
+-----+------+ 
14 rows in set (0.00 sec) 
+0

感謝@ P.Salmon,這似乎是工作! – Aaron