SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Jak działa last_insert_rowid() w SQLite

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak bezpieczny jest wątk EnableWriteAheadLogging w kontekście rzeczywistego użytkowania i dokumentacji SQLite?

  2. Wyszukiwanie z akcentem w sqlite (Android)

  3. android.database.CursorIndexOutOfBoundsException

  4. Jak sformatować wyniki zapytań SQLite w trybie TCL

  5. Jak sprawić, by operator LIKE SQLite uwzględniał wielkość liter?