如何通过ID范围自动递增?

时间:2019-06-25 08:29:24

标签: mysql auto-increment

我正在寻找创建脚本以将值添加到表中的列。 这将是一个脚本,我只执行一次,而不执行数据库或密钥的设置。

目前我大约有900行,因此脚本可以帮助我!

实际上

我实际上正在使用DBeaver 3.1.0。

SHOW VARIABLES LIKE "%version%";返回:

Variable_name          |Value                       
-----------------------|----------------------------
innodb_version         |1.1.8                       
protocol_version       |10                          
slave_type_conversions |                            
version                |5.5.28-log                  
version_comment        |MySQL Community Server (GPL)
version_compile_machine|x86                         
version_compile_os     |Win64                       

实际上我的桌子是这样的:

+----------------------------+
|  id  |  id_sort  |  id_tab |
+----------------------------+
|   1  |     0     |    1    |
+----------------------------+
|   2  |     0     |    1    |
+----------------------------+
|   3  |     0     |    2    |
+----------------------------+
|   4  |     0     |    2    |
+----------------------------+
|   5  |     0     |    2    |
+----------------------------+
|   6  |     0     |    3    |
+----------------------------+
|   7  |     0     |    4    |
+----------------------------+
|   8  |     0     |    4    |
+----------------------------+
|   9  |     0     |    5    |
+----------------------------+
|  10  |     0     |    5    |
+----------------------------+
|  11  |     0     |    5    |
+----------------------------+
|  12  |     0     |    6    |
+----------------------------+

我对此进行了测试,以查找如何进行更新,但无法将其添加到partition by中:

select t.id, (@rownum := @rownum + 1) as rank
FROM mytable t, 
(SELECT @rownum := 0) r

我需要

想法是创建这样的值(在id_sort中):

+----------------------------+
|  id  |  id_sort  |  id_tab |
+----------------------------+
|   1  |     1     |    1    |
+----------------------------+
|   2  |     2     |    1    |
+----------------------------+
|   3  |     1     |    2    |
+----------------------------+
|   4  |     2     |    2    |
+----------------------------+
|   5  |     3     |    2    |
+----------------------------+
|   6  |     1     |    3    |
+----------------------------+
|   7  |     1     |    4    |
+----------------------------+
|   8  |     2     |    4    |
+----------------------------+
|   9  |     1     |    5    |
+----------------------------+
|  10  |     2     |    5    |
+----------------------------+
|  11  |     3     |    5    |
+----------------------------+
|  12  |     1     |    6    |
+----------------------------+

我们将在id_sort中增加id_tab范围。

2 个答案:

答案 0 :(得分:0)

  • Derived table中,使用Row_number()功能确定新的id_sort值。
  • 将此子查询加入主键上的原始表,并使用新值更新id_sort字段。

尝试以下操作:

UPDATE 
mytable AS t1 
JOIN 
(SELECT id, 
        ROW_NUMBER() OVER (PARTITION BY id_tab ORDER BY id) as id_sort_new
FROM mytable) AS dt ON dt.id = t1.id 
SET t1.id_sort = dt.id_sort_new 

答案 1 :(得分:0)

在下面尝试一下

UPDATE `mytable` as t1
Left Join
(SELECT *,(@Count:= if(@TempID = `id_tab`, @Count1 +1, 1)) id_sort2,
(@TempID:=`id_tab`) Tempid
FROM (Select @Count:=0,@TempID:=0) sqlvar, `mytable` f
ORDER BY `id_tab`) AS t2 
ON t1.id= t2.id
SET t1.id_sort = t2.id_sort2;

让我们分解一下

SELECT *,(@Count:= if(@TempID = `id_tab`, @Count1 +1, 1)) id_sort2,
(@TempID:=`id_tab`) Tempid
FROM (Select @Count:=0,@TempID:=0) sqlvar, `mytable` f
ORDER BY `id_tab`

上面的查询根据id_tab对整个表进行排序,并生成一列id_sort2,该列基于id_tab使用变量和if条件进行计数。

接下来,我LEFT JOIN mytable as t1与上面的查询一起使用密钥t2成为id。和SET t1.id_sort = t2.id_sort2

不确定这是否是最好的方法,但是我对其进行了测试,并且可以正常工作。