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.

Jakub Vrána, Řešení problému, 27.1.2006, diskuse: 5 (nové: 0)

Diskuse

Michal:

Hezká finta :-)

O tom, ze LAST_INSERT_ID má i variantu s parametrem, jsem vůbec netušil...

Mike:

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

ikona Jakub Vrána OpenID:

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...

ikona Jakub Vrána OpenID:

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.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.