MySQL – jak zapełnić kolumnę w tabeli kolejnymi numerami

W MySQL kolejne numery przeważnie nadawane są w kolumnach, gdzie wartości są ustalane przez opcję AUTO_INCREMENT. Są to pierwsze kolumny identyfikujące ID danego rekordu.

Czasami jednak są dodatkowe kolumny, które np. ustalają pozycję danego rekordu. Jak wgrywamy dane do tabeli – musimy ręcznie nadawać kolejne numery wierszom.

Istnieje jednak proste zapytanie SQL które jest w stanie wypełnić taką kolumnę kolejnymi liczbami:)

Oto one:

SET @pos := 0;
UPDATE `nasza_tabela` SET `position` = ( SELECT @pos := @pos + 1 );

Tutaj kolumną którą wypełniamy jest kolumna o nazwie position.

Możemy też ograniczyć numerowanie dla określonych tylko wierszy.

Przykład. Mamy tabelę „jakas_tabela„:

mysql> select * from jakas_tabela;
+----+-----------+---------+---------+
| id | kolor     | wartosc | pozycja |
+----+-----------+---------+---------+
|  1 | czerwony  | AAA     |    NULL |
|  2 | niebieski | ZZZ     |    NULL |
|  3 | czerwony  | ABC     |    NULL |
|  4 | niebieski | XYZ     |    NULL |
|  5 | niebieski | RRR     |    NULL |
|  6 | niebieski | YYY     |    NULL |
+----+-----------+---------+---------+
6 rows in set (0.00 sec)

I chcemy tutaj ponumerować wartości w kolumnie pozycja od 1 do 4 dla niebieskiego i od 1 do 2 dla czerwonego. Jak to zrobić?

Wystarczy wywołać poniższe zapytanie:

SET @pos := 0;
UPDATE `jakas_tabela` SET `pozycja` = ( SELECT @pos := @pos + 1 ) WHERE `kolor` = 'czerwony';

SET @pos := 0;
UPDATE `jakas_tabela` SET `pozycja` = ( SELECT @pos := @pos + 1 ) WHERE `kolor` = 'niebieski';

Gotowe. Po odp. posortowaniu zapytania widać, że zapytanie działa:

mysql> select * from jakas_tabela ORDER by kolor,pozycja;
+----+-----------+---------+---------+
| id | kolor     | wartosc | pozycja |
+----+-----------+---------+---------+
|  1 | czerwony  | AAA     |       1 |
|  3 | czerwony  | ABC     |       2 |
|  2 | niebieski | ZZZ     |       1 |
|  4 | niebieski | XYZ     |       2 |
|  5 | niebieski | RRR     |       3 |
|  6 | niebieski | YYY     |       4 |
+----+-----------+---------+---------+
6 rows in set (0.00 sec)

Może dla 6 wierszy ręczna zmiana nie stanowi problemu, ale dla kilkudziesiędziu tysięcy – już tak 🙂

grafika:alphacoders.com

Możesz również polubić…

Inna porada:
Zapytanie pokazujące datę ostatniej modyfikacji danej tabeli w MySQL