Mam tabelę Zamówienia, która zawiera kolumnę Ilość. Podczas zameldowania lub wymeldowania musimy zaktualizować tę kolumnę Ilość o jeden. Czy jest sposób, aby to zrobić w jednej akcji, czy też musimy pobrać istniejącą wartość, a następnie dodać lub odjąć jedną na wierzchu?
Innym pytaniem jest, kiedy wstawiamy nowy wiersz, czy musimy sprawdzić, czy istnieją te same dane, a następnie wstawić, jeśli nie, co jest dwoma krokami, czy jest lepszy sposób na zrobienie tego?
dzięki,
Pojedynczą odpowiedzią na pierwsze pytanie jest użycie czegoś takiego:
Jest to w dużej mierze sposób na wykonanie jednej instrukcji.
Jeśli chodzi o drugie pytanie, nie powinieneś uciekać się do gimnastyki SQL specyficznej dla DBMS (np.
UPSERT
), Aby uzyskać pożądany wynik. Istnieje standardowa metoda wykonywania aktualizacji lub wstawiania, która nie wymaga określonego systemu DBMS.Oznacza to, że najpierw próbujesz stworzyć kreację. Jeśli już tam jest, zignoruj błąd. W przeciwnym razie tworzysz go z wartością 0.
Następnie wykonaj aktualizację, która będzie działać poprawnie, niezależnie od tego, czy:
To nie jest pojedyncza instrukcja, a jednak, co zaskakujące, tak robimy to z sukcesem przez długi czas.
źródło
Jeśli rozumiem, aktualizacje powinny być dość proste. Zrobiłbym tylko co następuje.
Aby zaktualizować jeden wiersz zamiast wszystkich wierszy, możesz potrzebować dodatkowych filtrów.
W przypadku wstawiania możesz buforować lokalnie unikalne identyfikatory związane z Twoim rekordem i sprawdzać je w tej pamięci podręcznej i decydować, czy wstawić, czy nie. Alternatywnym podejściem jest zawsze wstawianie i sprawdzanie błędu naruszenia PK i ignorowanie, ponieważ jest to nadmiarowe wstawianie.
źródło
O ile wiem, w SQL nie ma wbudowanego wsparcia dla INSERT-OR-UPDATE. Proponuję utworzyć procedurę składowaną lub użyć zapytania warunkowego, aby to osiągnąć. Tutaj znajdziesz zbiór rozwiązań dla różnych baz danych.
źródło
odpowiedzieć na drugie:
uczynić kolumnę unikalną i przechwycić wyjątek, jeśli ma tę samą wartość.
źródło
@dotjoe Taniej jest zaktualizować i sprawdzić @@ rowcount, po czym wstawić fakt.
Wyjątki są drogie, a aktualizacje są częstsze
Sugestia: jeśli chcesz mieć najwyższą wydajność w swoim DAL, wprowadź interfejs użytkownika w unikalnym identyfikatorze wiersza, który ma zostać zaktualizowany, jeśli wstawia wartość null.
DAL powinny być CRUD i nie muszą się martwić, że są bezpaństwowcami.
Jeśli uczynisz to bezstanowym, przy dobrych indeksach nie zobaczysz różnicy z następującą instrukcją SQL vs 1. IF (wybierz górny 1 * formularz x, gdzie PK = @ ID) Wstaw else aktualizacja
źródło