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.
Usunięcie "najnowszego" wiersza
- Rejestracja: dni
- Ostatnio: dni
- Postów: 18
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2794
Tak to jest jak się samemu nadaje ID, a nie korzysta z autoincrement...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1506
Albo używasz autoincrement, albo dodajesz nową kolumnę z dokładnym czasem dodania rekordu.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
Gdy dodamy element o ID = 2
Dlaczego mielibyście coś takiego robić?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1506
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2385
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?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 18
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3561
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1506
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 18
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: WPR
- Postów: 136
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() )