我正在寻找创建脚本以将值添加到表中的列。 这将是一个脚本,我只执行一次,而不执行数据库或密钥的设置。
目前我大约有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
范围。
答案 0 :(得分:0)
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
。
不确定这是否是最好的方法,但是我对其进行了测试,并且可以正常工作。