Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Ponumerowanie rekordów w bazie liczbami
Forum PHP.pl > Forum > Przedszkole
Matt23
Witam zebranych,
chciałbym się dowiedzieć w jaki sposób zrobić update do bazy, aby zmienić ID wszystkim rekordom by owe ID było względem siebie rosnące.

Sprawa wygląda tak, że mam straszne luki w tym id i chciałbym je pozmieniać na rosnące liczby. Jakim poleceniem mogę to zrobić?

Aktualnie mam

ID TABELA
21 Andrzej
47 Grzegorz
67 Anna

Chciałbym to zmienić na

1 Andrzej
2 Grzegorz
3 Anna
mmmmmmm
Po co? ID is ID - nie zmienia się.
Matt23
W formie zdobywania doświadczenia może być?
pedro84
Ale to jest totalnie bezsensu. Chcesz sobie numerować to sobie numeruj w pętli. A do zdobywania doświadczenia Ci się to nie przyda.

Sam update robisz za pomocą UPDATE.
Matt23
Ale nie wiem jak sie za to zabrać. Jestem wstanie wygenerować sobie w pętli określona ilość numerów, ale jak skonstruować zapytanie?
pedro84
W pętli masz jakiś index a przy przebiegu pętli zwiększasz jego wartość o jeden. Reszta to podstawowe zapytanie UPDATE, ale podkreślam, tak się nie robi w żaden sposób.
SmokAnalog
Kiedyś też chciałem łatać luki w identyfikatorach i robiłem to tak (przykład na przestarzałych funkcjach mysql_):
  1. $query = mysql_query('SELECT `id` FROM `tabela` ORDER BY `id` ASC');
  2. for ($id = 1; $row = mysql_fetch_assoc($query); $id++) {
  3. if ($id !== (int) $row['id']) {
  4. mysql_query('UPDATE `tabela` SET `id` = ' . (int) $i . ' WHERE `id` = ' . (int) $row['id']);
  5. }
  6. }


Dzięki ORDER BY `id` ASC nie zrobi się bałagan, bo nadpisujesz zawsze identyfikatory większe lub równe aktualnej zmiennej iteracyjnej.

Ale jak koledzy wyżej wspomnieli, łatanie dziur nie ma sensu smile.gif Klucz podstawowy jest z definicji wartością bez żadnej wartości informacyjnej, a luki przynajmniej przypominają nam, że coś usuwaliśmy smile.gif
Matt23
Jest jeszcze lepiej niż było, pojawiło sie id 0 i między wierszami zgubiły się liczby
trueblue
Dodaj nową kolumnę, np. pole.
  1. UPDATE tabela,(SELECT @id:=0) AS tmp SET pole=(SELECT @id:=@id+1)

Usuń id, zmień pole na id.

Możesz też update'ować samą siebie jeśli masz pewność, że nie nastąpi kolizja (jeśli pole to klucz lub ma indeks unique).
Matt23
Użyłem tego zapytania i niby coś się zrobiło, ale nie mogę posortować rekordów względem kolumny `pole`. Podczas sortowania nie zachowuje kolejności rosnącej/malejącej. Przy czym z tego co widzę, to nowa nuemracja nie zachowała starej kolejności, jest na to sposób?
SmokAnalog
Pisałem z palca w jednym miejscu zrobiłem $i zamiast $id. Popraw to i spróbuj.
Matt23
Z problemami, ale jakoś poszło rozwiązanie Smoka, dziękuję.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.