Usunięcie "najnowszego" wiersza

0

Próbuję rozwiązać ten problem w przypadku gdy nie jesteśmy w stanie po niczym posortować. Np. mamy 3 elementy o ID 1, 3, 5. Gdy dodamy element o ID = 2, po czym będziemy usuwali najnowszy element sortując po ID usuniemy element 5, czyli nie ten którego szukamy.
Udało mi się po części rozwiązać to stosując ROLLBACK, ale trzeba użyć tego natychmiast (np. w triggerze), i wydaje mi się że przerywa to działanie wsadu.

3

Tak to jest jak się samemu nadaje ID, a nie korzysta z autoincrement...

3

Albo używasz autoincrement, albo dodajesz nową kolumnę z dokładnym czasem dodania rekordu.

3

Gdy dodamy element o ID = 2

Dlaczego mielibyście coś takiego robić?

2

Kolega @serek zapodał Ci najlepszą odpowiedź. Robienie rollbacków z wymienionych przez Ciebie powodów w skutek braku designu na poziomie bazy DB to jest kryminał.

1

Co do ustawiania ID przed wysłaniem danych do bazy - ma to sens, jeśli używasz UUID. Generujesz sobie go zawsze przy tworzeniu nowego obiektu, a potem dane obiektu zapisujesz do bazy. Chociaż i tak zwykle opłaca się mieć oba - UUID do wyświetlania dla końcowych userów (by nie znali prawdziwego ID), oraz ID, który będzie stosowany w relacjach/wyszukiwaniu, bo int jest szybszy niż string.

1

Nie tylko UUID. Ogólnie jeśli potrzebujemy mieć jakieś ID biznesowe jak w tym przypadku, to powinno ono być w oddzielnej kolumnie i całkowicie niezależne od klucza głównego tabeli.

1
Kapral214 napisał(a):

Próbuję rozwiązać ten problem w przypadku gdy nie jesteśmy w stanie po niczym posortować. Np. mamy 3 elementy o ID 1, 3, 5. Gdy dodamy element o ID = 2, po czym będziemy usuwali najnowszy element sortując po ID usuniemy element 5, czyli nie ten którego szukamy.
Udało mi się po części rozwiązać to stosując ROLLBACK, ale trzeba użyć tego natychmiast (np. w triggerze), i wydaje mi się że przerywa to działanie wsadu.

A co to znaczy najnowszy element? I dla kogo? Wygląda, że nie jest to atrybut biznesowy, bo gdyby takowy był, to siedziałby w tej tabeli.
Jaki problem rozwiązujesz usuwając "najnowszy" element?

0

Załóżmy że wprowadzone dane są nieprawidłowe i chcę usunąć ostatnio dodany wiersz.

Wiem, że mój przykład z ID jest dziwny, ale powiedzmy że mamy tabelę z jakimiś przedmiotami, i usuwamy konkretny. W identyfikatorach zrobi nam się "dziura", i dodając nowy możemy ją wypełnić. Ja wiem że w praktyce wszystko jest automatyczne i nikt nie pisze na sucho kodu żeby coś dodać, ale zostańmy jeszcze na poziomie przykładów.

4
Kapral214 napisał(a):

Załóżmy że wprowadzone dane są nieprawidłowe i chcę usunąć ostatnio dodany wiersz.

Wiem, że mój przykład z ID jest dziwny, ale powiedzmy że mamy tabelę z jakimiś przedmiotami, i usuwamy konkretny. W identyfikatorach zrobi nam się "dziura", i dodając nowy możemy ją wypełnić. Ja wiem że w praktyce wszystko jest automatyczne i nikt nie pisze na sucho kodu żeby coś dodać, ale zostańmy jeszcze na poziomie przykładów.

Masz złe wyobrażenie o bazach. Zły projekt bazy. Zły pomył na czynność (co, gdy baza pracuje na rzecz dwóch operatorów - Twoje pomysły wylatują w powietrze u samego początku) A "recykling identyfikatorów" jest jednym z najgorszych pomysłów

2
Kapral214 napisał(a):

Załóżmy że wprowadzone dane** są nieprawidłowe** i chcę usunąć ostatnio dodany wiersz.

Po to robi się walidację przed wprowadzeniem danych. Dodatkowo istnieje takie coś jak transakcje.

0

Czyli z odpowiedzi wnioskuję, że jedyną logiczną opcją usunięcia najnowszego wiersza jest po prostu posortowanie według ID lub daty wprowadzenia (jeśli taka istnieje).
Dzięki za pomoc, resztę sugestii też sobie zapamiętam.

0

Czyli z odpowiedzi wnioskuję, że jedyną logiczną opcją usunięcia najnowszego wiersza jest po prostu posortowanie według ID lub daty wprowadzenia (jeśli taka istnieje).
Dzięki za pomoc, resztę sugestii też sobie zapamiętam.

posortowanie wg id tylko jeśli ta kolumna jest autoincrement
jeśli nie jest autoincrement to tylko ratuje Cię dodatkowo kolumna z datą wpisu (domyślnie ustaw getdate() )

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