sql >> Databáze >  >> RDS >> SQLite

Jak funguje last_insert_rowid() v SQLite

SQLite má funkci nazvanou last_insert_rowid() který vrací ROWID posledního vložení řádku z databázového připojení, které vyvolalo funkci.

Příklad

Zde je příklad demonstrující, jak funguje last_insert_rowid() funkce funguje v SQLite.

Nejprve vytvoříme tabulku a vložíme nějaká data:

CREATE TABLE Cats( 
    CatId INTEGER PRIMARY KEY, 
    CatName
);

INSERT INTO Cats VALUES 
    ( NULL, 'Brush' ),
    ( NULL, 'Scarcat' ),
    ( NULL, 'Flutter' );

Tím se automaticky vytvoří ROWID pro každý řádek. Tento příkaz SQL by proto vytvořil tři různé ROWID; 1, 2 a 3.

Nyní můžeme použít last_insert_rowid() funkce vrátí hodnotu posledního ROWID.

SELECT last_insert_rowid();

Výsledek:

3

Podle očekávání je poslední ROWID 3.

Vložit do jiné tabulky

Všimněte si, že last_insert_rowid() funguje na základě připojení k databázi, nikoli na úrovni tabulky.

Pokud tedy vytvořím novou tabulku, pak do této tabulky vložím řádky, last_insert_rowid() hodnota bude založena na tom operace vložení.

CREATE TABLE Dogs( 
    DogId INTEGER PRIMARY KEY, 
    DogName
);

INSERT INTO Dogs VALUES 
    ( NULL, 'Yelp' ),
    ( NULL, 'Woofer' );

SELECT last_insert_rowid(); 

Výsledek:

2

Jako vedlejší poznámku, když jsem vytvářel tabulky, definoval jsem první sloupce jako sloupce s automatickým přírůstkem. Toto bylo definováno implicitně, když jsem použil INTEGER PRIMARY KEY .

Když tedy vyberu všechny řádky, vidím, že poslední řádek obsahuje last_insert_rowid() hodnotu v tomto sloupci.

SELECT * FROM Dogs;

Výsledek:

DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    

V SQLite je sloupec typu INTEGER PRIMARY KEY aliasem pro ROWID.

Následující dotaz to ukazuje.

SELECT 
  rowid,
  * 
FROM Dogs;

Výsledek:

DogId       DogId       DogName   
----------  ----------  ----------
1           1           Yelp      
2           2           Woofer    

Všimněte si, že je možné vytvořit sloupec bez použití vestavěné funkce automatického přírůstku SQLite. Pokud to uděláte, váš sloupec „ID“ může mít jinou hodnotu než hodnota ROWID.

Je také možné přepsat hodnotu automatického přírůstku vlastní explicitní hodnotou. V tomto případě však bude hodnota ROWID stále odrážet tuto explicitní hodnotu.

INSERT INTO Dogs 
VALUES ( 789, 'Fluff' );

SELECT 
  rowid,
  * 
FROM Dogs;

SELECT last_insert_rowid();

Výsledek:

DogId       DogId       DogName   
----------  ----------  ----------
1           1           Yelp      
2           2           Woofer    
789         789         Fluff     

A samozřejmě last_insert_rowid() bude také odrážet tuto nejnovější hodnotu ROWID.

SELECT last_insert_rowid();

Výsledek:

789

Co je ROWID?

ROWID je 64bitový celočíselný klíč se znaménkem, který jednoznačně identifikuje řádek v tabulce. Všechny tabulky v SQLite mají ROWID, pokud tabulka není definována pomocí WITHOUT ROWID .

K hodnotě ROWID lze přistupovat pomocí jednoho ze speciálních názvů nezávislých na velikosti písmen rowid , oid nebo _rowid_ místo názvu sloupce. Pokud tabulka obsahuje uživatelem definovaný sloupec s jedním z těchto názvů, pak tento název vždy odkazuje na explicitně deklarovaný sloupec a nelze jej použít k načtení celočíselné hodnoty ROWID.

Když definujete tabulku se sloupcem s automatickým přírůstkem, tento sloupec automaticky použije pro svůj řádek hodnotu ROWID.

Další informace naleznete v části Jak funguje AUTOINCREMENT v SQLite.


  1. Převeďte uniklý znak Unicode zpět na skutečný znak v PostgreSQL

  2. Nelze vložit záznam do databáze SQLite ze služby Firebase Message Service, když je aplikace na pozadí nebo je zavřená

  3. Oracle SQL:Použijte sekvenci v insert s příkazem Select

  4. Jak uniknout % z dotazu python mysql