Как автоматически увеличить на диапазон идентификаторов? - PullRequest
0 голосов
/ 25 июня 2019

Я хочу создать скрипт для добавления значений в столбец в моей таблице.Это был бы сценарий, который я выполнял бы только один раз, а не параметр базы данных или ключ.

В настоящее время у меня ~ 900 строк, поэтому сценарий мне поможет!

На самом деле

На самом деле я использую DBeaver 3.1.0.

SHOW VARIABLES LIKE "%version%"; return:

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 голосов
/ 25 июня 2019

Попробуйте это ниже

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.

Не уверен, что это лучший метод, но я проверил его, и он работает.

0 голосов
/ 25 июня 2019
  • В производной таблице определите новое значение id_sort с помощью функции Row_number ().
  • Присоедините этот подзапрос к исходной таблице первичного ключа и обновите поле 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 
...