SQLite ma funkcję o nazwie last_insert_rowid()
który zwraca ROWID ostatniego wiersza wstawionego z połączenia z bazą danych, które wywołało funkcję.
Przykład
Oto przykład pokazujący, jak last_insert_rowid()
funkcja działa w SQLite.
Najpierw utwórzmy tabelę i wstawmy trochę danych:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
Spowoduje to automatyczne utworzenie ROWID dla każdego wiersza. Dlatego ta instrukcja SQL utworzyłaby trzy różne identyfikatory ROWID; 1, 2 i 3.
Możemy teraz użyć last_insert_rowid()
funkcja zwracająca wartość ostatniego ROWID.
SELECT last_insert_rowid();
Wynik:
3
Zgodnie z oczekiwaniami ostatni ROWID to 3.
Wstaw do innej tabeli
Zauważ, że last_insert_rowid()
działa w oparciu o połączenie z bazą danych, a nie na poziomie tabeli.
Dlatego jeśli utworzę nową tabelę, a następnie wstawię wiersze do tej tabeli, last_insert_rowid()
wartość będzie oparta na tym operacja wstawiania.
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY,
DogName
);
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' );
SELECT last_insert_rowid();
Wynik:
2
Na marginesie, kiedy tworzyłem tabele, zdefiniowałem pierwsze kolumny jako kolumny z autoinkrementacją. Zostało to zdefiniowane niejawnie, gdy użyłem INTEGER PRIMARY KEY
.
Dlatego po zaznaczeniu wszystkich wierszy widzę, że ostatni wiersz zawiera last_insert_rowid()
wartość w tej kolumnie.
SELECT * FROM Dogs;
Wynik:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer
W SQLite kolumna typu INTEGER PRIMARY KEY jest aliasem dla ROWID.
Pokazuje to poniższe zapytanie.
SELECT
rowid,
*
FROM Dogs;
Wynik:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer
Zauważ, że możliwe jest utworzenie kolumny bez użycia wbudowanej funkcji autoinkrementacji SQLite. Jeśli to zrobisz, kolumna „ID” może mieć inną wartość niż wartość ROWID.
Możliwe jest również nadpisanie wartości autoinkrementacji własną, jawną wartością. Jednak w tym przypadku wartość ROWID nadal będzie odzwierciedlać tę jawną wartość.
INSERT INTO Dogs
VALUES ( 789, 'Fluff' );
SELECT
rowid,
*
FROM Dogs;
SELECT last_insert_rowid();
Wynik:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer 789 789 Fluff
I oczywiście last_insert_rowid()
będzie również odzwierciedlać tę najnowszą wartość ROWID.
SELECT last_insert_rowid();
Wynik:
789
Co to jest ROWID?
ROWID to 64-bitowy klucz liczby całkowitej ze znakiem, który jednoznacznie identyfikuje wiersz w jego tabeli. Wszystkie tabele w SQLite mają ROWID, chyba że tabela jest zdefiniowana za pomocą WITHOUT ROWID
.
Dostęp do wartości ROWID można uzyskać za pomocą jednej ze specjalnych nazw niezależnych od wielkości liter rowid
, oid
lub _rowid_
w miejsce nazwy kolumny. Jeśli tabela zawiera kolumnę zdefiniowaną przez użytkownika używającą jednej z tych nazw, nazwa ta zawsze odwołuje się do jawnie zadeklarowanej kolumny i nie można jej użyć do pobrania całkowitej wartości ROWID.
Kiedy definiujesz tabelę z kolumną autoinkrementacji, ta kolumna automatycznie używa wartości ROWID dla swojego wiersza.
Zobacz, jak działa AUTOINCREMENT w SQLite, aby uzyskać więcej informacji.