Sekvence v MySQL
Školení, která pořádám
O sekvencích jsem se zmiňoval v článku o návrhu databáze. MySQL (a např. i SQLite) místo nich používá koncepci autoinkrementace, která je pro generování primárních klíčů o něco jednodušší. Pokud ale skutečně pouze potřebujeme generovat posloupnost čísel, u kterých nepotřebujeme ukládat dodatečné informace (např. pro vytvoření jednoznačného identifikátoru uživatele posílaného v cookie), dají se sekvence emulovat:
<?php
mysql_query("UPDATE sekvence SET id = LAST_INSERT_ID(id+1)");
$uzivatel = mysql_insert_id();
?>
V tabulce sekvence
musí být jediný řádek a sloupec id
musí mít příznak AUTO_INCREMENT. Výhoda tohoto přístupu je zřejmá – tabulka se zbytečně neplní bezvýznamnými čísly.
Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.
Diskuse
Michal:
Hezká finta :-)
O tom, ze LAST_INSERT_ID má i variantu s parametrem, jsem vůbec netušil...
Dobrý den přeji.
Toto vypadá elegantně ale asi to fungovat nebude pokud nejprve tabulku naplním daty (pak se last_inserted_id chová Ok např. poslední vrátí 20) pak data z tabulky smažu (pak last_inserted_id vrací NULL) a nesprávně tedy uložíme třeba souvissející obrázek na disk s jiným ID !!.
Zatím jsem přišel jen na využití příkazu:
SHOW TABLE STATUS FROM <databaze> LIKE <'tabulka'>
sloupec Auto_Increment. Skuste testík (Mysql 4) Díky.
Mike
Zdá se, že si myslíš, že článek pojednává o něčem jiném, než o čem skutečně pojednává. O jakém plnění daty a mazání mluvíš? Jak je uvedeno v článku, tabulka je jednořádková a nic se do ní nepřidává ani se z ní nemaže.
Jáchym:
Asi mi něco uniká, ale proč nestačí UPDATE sekvence SET id = id+1? Nějak nechápu co v tomto smyslu dělá LAST_INSERT_ID a k čemu je dát mu parametr...
Zavolání LAST_INSERT_ID(id+1) způsobí, že se hodnota uloží tak, že ji lze následně získat pomocí mysql_insert_id(). Zároveň vrátí předaný parametr (id+1).
Bez její přítomnosti by nebylo jako zjistit, jakou hodnotu jsme vlastně uložili.
Diskuse je zrušena z důvodu spamu.