[MySQL] Zmniejszenie wartości kolumny o 1

0

Cześć. Sprawa wygląda następująco. Posiadam pewną tabelę. Znajduje się w niej kolumna, która jest ustawiona jako unique. Znajdują się w niej liczby od 1 do X. Ta kolumna służy mi do tego aby sortować na stronie WWW ręcznie rekordy z tej tabeli.

Mam napisaną taką funkcjonalność, która umożliwia usuwanie danych z tej tabeli. Jeśli usuwam rekord, który w kolumnie z sortowaniem miał wartość na przykład 6, chcą aby kolumny z wartością > 6 zmniejszyły się o 1 aby zachować spójność w sortowaniu.

W tym celu wykonuję takie zapytania:

                        $db->query("START TRANSACTION") or die($db->error);
                        $q1 = $db->query("DELETE FROM objects WHERE object_id = '".$id."'") or die($db->error);
                        $q2 = $db->query("UPDATE objects SET object_order = object_order - 1 WHERE object_order > '".$order."'") or die($db->error);

                        if($q1 && $q2) {
                            $db->query("COMMIT") or die($db->error);
                        } else {
                            $db->query("ROLLBACK") or die($db->error);
                        }

Niestety. Pierwsze zapytanie dostaje wartość true, drugie wywala błąd "Duplicate entry for key ...". Zmienna $order ma prawidłową wartość więc problem leży w bazie danych. Oczywiście sprawdziłem zawartość tej kolumny i nie występuje żaden duplikat.

Zapytanie "UPDATE cms_objects SET object_order = object_order - 1" użyte w phpMyAdmin wyrzuca taki sam błąd.

Co robię nie tak? Nie da się tak zmniejszać kolumny, która ma indeks Unique?

1

Trochę to bez sensu. Co zyskasz przenumerowując ?
Tak się nie robi ...
Przecież po usunięciu wiersza z tabeli bez przenumerowania, sortowanie również będzie działać

0

Ma to sens bo nie mam przerw między cyframi w tej kolumnie po usunięciu.
A jak mam funkcje od sortowania to wykorzystuję zmienne $order_actual oraz $order_previous = $order_actual - 1.

To przecież musi tak działać. Pytanie dlaczego nie chce.

2

Zdaje się, że mamy do czynienia z typowym problemem X/Y - dlaczego zaprojektowałeś Twoje sortowanie tak, że "nie może być dziur"?
W jaki sposób sortujesz te obiekty?

(btw, actual znaczy prawdziwy - słowo, które powinieneś wykorzystać, to current)

0

@Kisialala:
jak napisał @Patryk27
Twoim problemem jest sam algorytm sortowania

0

@Patryk27: Pozwolę sobie się nie-do-końca zgodzić z tym, co napisałeś odnośnie słowa actual :P

screenshot-20190304213313.png

0

Nawet jakbym się zgodził na dziury to nie chcę dopuścić do takiej sytuacji, że wiele rekordów będzie miało tą samą wartość order, np 2.

2

Dziury w numeracji a duplikaty coś zupełnie innego.
Samo usuwanie wierszy nie stworzy duplikatów
Uważam że walczysz z problemem który sam sobie stworzyłeś przez niezbyt szczęśliwy algorytm sortowania, który wymaga stałego i równego jeden kroku w polu będącym argumentem sortowania

0

Usuwanie nie ale funkcje sortujące już tak.

Nie dyskutujmy na temat mojej metody sortowania. Wyjaśnijcie proszę dlaczego nie da się zmniejszać wartości kolumny z indeksem Unique nawet poprzez phpMyAdmin. A jeśli się da to czemu to nie chce działać?

0

Usuwanie nie ale funkcje sortujące już tak.

dobrze widzę ???funkcje sortujące tworzą duplikaty ??

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