środa, 30 maja 2012

Id autoinkrementowanego pola w bazie

Zdarza się często, iż musimy pobrać id ostatnio wstawionego wiersza w tabeli. Dla różnych serwerów bazodanowych, pobranie tej wartości następuje w inny sposób.
Swoją drogą szkoda że w SQLu nie ma jednej standaryzowanej metody pobierania id wstawionego rekordu. Przez to niestety musimy dla każdej bazy konstruować inny rodzaj inserta.

ORACLE.
Tutaj sprawa jest bardzo prosta i wszystko właściwie załatwia jedno słowo kluczowe - returning:


Code:
INSET INTO Table(Id, FirstName) VALUES(MySeq.nextval, 'Marek') RETURNING Id INTO @id


MS SQL
Tutaj sprawa jest pozornie bardziej skomplikowana. Nie ma takiego wygodnego sposobu jak w Oracle zwrotu wartości pola po wykonanym Insercie.
Funkcją, która zwraca Id jest tutaj SCOPE_IDENTITY(). Tak więc po każdym insercie należy zawołać tę funkcję a ona zwróci numer. Należy pamiętać o jednym bardzo ważnym aspekcie: instrukcja insert i później select muszą być wykonane inline, czyli jedna po drugiej, w przeciwnym razie zamiast oczekiwanego id otrzymamy nulla:


Code:
INSET INTO Table(Id, FirstName) VALUES(MySeq.nextval, 'Marek') RETURNING Id INTO @id

Kolejne bazy będą dodawane wraz z zapotrzebowaniem na zapytania :)
A może macie już gotowe instrukcje pobierania id? Czekam na propozycje w komentarzach.


SQLITE
W tej bazie znam dwa sposoby na znalezienie ostatnio wstawianej wartości. Jeżeli w tabeli istnieje pole autoinkrementowane możemy skorzystać z instrukcji:


Code:
SELECT seq FROM sqlite_sequence WHERE name='TableName'

Brak komentarzy:

Prześlij komentarz