[php+Mysql] Zamiana rekordów miejscami

0

Witam. Wyobraźmy sobie że mamy taką tabele w mysql

...nazwa........opis........id
...post........to jest post........1
...test........a to test........2
coś tu kiedyś było ale usunięto//
...test2........kolejny test........4

Oczywiście tabela ciągnie się dalej, czasami miewając takie puste wpisy. I teraz problem: jak przenieść rekord wyżej tak by np id2 zamienić z id1, ale też by zamienić id4 z id2 a nie z tym pustym. Chodzi mi o metodę uniwersalną.

//pozdrawiam

0

Innymi slowy chcesz miec numery id bez dziur? Po co? Jezeli id jest kluczem to jedyne co od niego wymagac to unikalnosci, a ta tutaj jest zachowana. Sztuczne usuwanie dziur dodaje tylko roboty. Mysql zadba by numery sie nie powtarzaly (auto_increment), wiec nic wiecej do szczescia zwykle nie potrzeba. Napisz po co Ci to, to moze inaczej da sie rozwiazac Twoj oryginalny problem. Takie pytanie jak powyzej wynika zwykle z niezrozumienia idei identyfikatora (bez urazy of coz).

0

Nie zrozumieliśmy się, ale spoko, źle wytłumaczyłem. Chodzi o to że np dodaje do db 4newsy, i po jakimś czasie usuwam np 2, ale następny dodaje się jako 5. Normalne. Ale mi chodzi oto że chciałbym te np newsy zamienić miejscami, tak by 3 był 1 a 1 trzecim. Pamiętajmy że dwójki już NIE MA.

0

no to 2 update'y, kazdy zamieniajacy wartosci konkretnego rekordu. Osobiscie wole dawac osobne pole 'order' niz opierac kolejnosc na id.

0

Ale chodzi mi o to że czasami jest usunięty news, czasami nie, nie dojdziesz, więc nie umiem zrobić konkretnego kodu. Chciałbym by to jakoś wykrywało, czy cuś.

0

To wybierz rekord o id mniejszym niż aktualne i zamien ich id. Proste.
SELECT id FROM blabla WHERE id<x order by id asc limit 0,1 i potem update

0

ale po co? potrzebujesz po kolei? dodajesz order by. boisz się fragmentacji bazy danych? dajesz indeks typu clustered na id - jednak to nie twoje zadanie, żeby pilnować jak są ułożone rekordy wewnątrz tabeli.
jeśli zmieniasz ręcznie zmieniasz identyfikatory, to jeśli potem będziesz chciał dodać jakiekolwiek relacje do tej tabeli, to błyskawicznie pogubisz dane i tabele będą niespójne. twoja idea jest po prostu kiepska. dodaj dodatkowe pole "order", czy coś takiego, tak jak sugeruje johny.

0

czyli jak dodam "order" to przy każdym będzie dodawało o jeden więcej czyli w sumie będzie identycznie jak id..
a jest może jakieś coś co będzie zawsze utrzymywało kolejność? tzn żeby zamiast primary key w id dać coś by zawsze liczyło ort!?
bo <ort>na razie </ort>id robie tylko auto_icrement i to mi starczało..

0

Jak dodasz dodatkowe pole z kolejnoscia to sobie bedziesz mogl sortowac po nim za pomoca 'order by'. Wtedy, zeby zmienic kolejnosc wystarczy tylko zamienic te 2 liczby w 2 rekordach. ID sluzy tylko do identyfikacji, nic Ci do tego jak zalatwia to baza. Tym bardziej, ze to 'tylko' oznacza w konsekwencji mozliwosc istnienia kluczy obcych, relacji, pozniejszego uzycia joina, itp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1