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.