[英]Copy rows and increment column
我有一個表,需要復制行。 該表具有一個主自動遞增鍵以及一個用於將行分組在一起的列。 有沒有一種方法可以復制將組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(grp=@prev,
-- 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:=@new+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
我認為您需要在子查詢中分配新的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:=@new+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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.