簡體   English   中英

復制行和增量列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM