2017-09-09 10 views
0

私は行をコピーする必要があるテーブルがあります。テーブルには、プライマリの自動インクリメントキーと、行をグループ化するための列があります。グループIDが最後の値から増分するように設定された一連の行をコピーする方法はありますか?コピーされた行のGRPが始まること行と増分列をコピー

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 

は注意:ここで

は、基本的な例元のテーブルのデータは、私の目標は、行1-7をコピーして、このような結果を持つことである

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

です元の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を割り当てた後、元の順序にP.Salmon @

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

感謝を注文する必要があると思う、それが動作しているようです! – Aaron