Bardzo często w bazach danych korzystamy z autoinkrementacji. Jest to bardzo wygodna forma nadawania wartości klucza głównego, ponieważ serwer dba za nas o to, więc kompletnie nie musimy się tym przejmować.

Dodając nowy wiersz podajemy wszystkie wartości w wierszu, poza wartością autoinkrementowanego klucza. Sytuacja jest też dość prosta, gdy dodajemy wiersz, w którym należy podać wartość z istniejącego wiersza, np. gdy dodajemy wiersz z nowym pracownikiem, należy podać id działu w którym pracuje.

Problem zaczyna się robić podczas dodawania danych w relacji wiele do wielu, np. dodajemy nowy zakup i do tabeli pośredniczącej dodajemy pary kluczy nowo dodanego zakupu i produktu. Musimy podczas pojedynczej komunikacji z bazą danych (transakcja) dodać wiersz zakupu, pobrać jego id i dodawać kolejne wiersze do tabeli pośredniczącej z pobranym id.

Jak możemy pobrać identyfikator nowo dodanego zakupu? Bardzo prostym rozwiązaniem jest wyciągnięcie maksymalnej wartości z kolumny IdZakupu. Niestety nie zadziała to w momencie, gdy wielu użytkowników będzie korzystało tej samej bazy danych jednocześnie. Istnieje wtedy duże prawdopodobieństwo, że pomiędzy dodaniem wiersza, a pobraniem wartości pojawi się nowy wiersz w tabeli, więc pobierzemy nieswojego „ajdika”.


Istnieje również zmienna @@IDENTITY – zwraca ona ostatnio nadaną wartość autoinkrementowanego klucza w całej bazie danych. Natomiast dzięki funkcji IDENT_CURRENT(nazwa_tabeli) otrzymamy ostatnio nadany klucz we wskazanej tabeli. Oba rozwiązania niestety nie rozwiążą problemu.

Najlepszy sposób to skorzystanie z funkcji SCOPE_IDENTITY(). Dzięki niej otrzymamy ostatnio wygenerowany klucz w bieżącym kontekście (transakcji). Jak zatem będzie wyglądało nasze zapytanie do bazy?

INSERT INTO Zakupy (DataZakupu) VALUESE (GETDATE())

DECLARE @idZakupu int
SELECT @idZakupu = CAST(SCOPE_IDENTITY() as int)

INSERT INTO Zakup_Produkty VALUES (@idZakupu, 1)

Microsoft w MSSQLu daje nam bardzo dużo możliwości związanych z generowaniem klucza. W SQL Server doszło SEQUENCE, które również pozwala nam tworzyć automatycznie wyliczane klucze. Na tym przykładzie łatwo zauważyć, że pomimo tylu możliwości, nie każde rozwiązanie będzie dobre w każdym przypadku. Warto wiec sprawdzić kilka możliwych rozwiązań i wybrać najlepsze.

Dołącz do newslettera już dziś!
Zero spamu - tylko wartościowe treści!
Musisz już lecieć?
Zostaw swój adres e-mail i dołącz do BEZPŁATNYCH WEBINARÓW dotyczących SQLa!
  • „Jak uczyć się SQLa?” – 4 października
  • „SQL dla testerów” – 12 października