Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Ponumerowanie rekordów w bazie liczbami
Matt23
post 22.07.2014, 17:44:17
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mmmmmmm
post 22.07.2014, 17:56:06
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Po co? ID is ID - nie zmienia się.
Go to the top of the page
+Quote Post
Matt23
post 22.07.2014, 17:58:24
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (0%)
-----


W formie zdobywania doświadczenia może być?
Go to the top of the page
+Quote Post
pedro84
post 22.07.2014, 18:36:27
Post #4





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
Matt23
post 22.07.2014, 18:39:46
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (0%)
-----


Ale nie wiem jak sie za to zabrać. Jestem wstanie wygenerować sobie w pętli określona ilość numerów, ale jak skonstruować zapytanie?
Go to the top of the page
+Quote Post
pedro84
post 22.07.2014, 18:42:05
Post #6





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
SmokAnalog
post 22.07.2014, 19:04:50
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Matt23
post 22.07.2014, 19:17:35
Post #8





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (0%)
-----


Jest jeszcze lepiej niż było, pojawiło sie id 0 i między wierszami zgubiły się liczby
Go to the top of the page
+Quote Post
trueblue
post 22.07.2014, 19:20:16
Post #9





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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).

Ten post edytował trueblue 22.07.2014, 19:22:36


--------------------
Go to the top of the page
+Quote Post
Matt23
post 22.07.2014, 19:37:18
Post #10





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
SmokAnalog
post 22.07.2014, 20:00:47
Post #11





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Pisałem z palca w jednym miejscu zrobiłem $i zamiast $id. Popraw to i spróbuj.
Go to the top of the page
+Quote Post
Matt23
post 22.07.2014, 20:33:11
Post #12





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 19.01.2013

Ostrzeżenie: (0%)
-----


Z problemami, ale jakoś poszło rozwiązanie Smoka, dziękuję.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 15:21