Diskuze: Nasledujúce ID v databáze
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Pokud myslíš MySQL/MariaDB tak žádná oficiální možnost neexistuje, není k tomu ani moc důvod. Zjistit se ale dá poslední hodnota:
SELECT LAST_INSERT_ID()
Proč by to nemělo jít. Vždyť normálně např. phpmyadmin tuto hodnotu umí zobrazit. A jelikož používám mariadb tak vím že to jde.
Ahoj je to jednoduché složí k tomu tento dotaz
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = ""
AND TABLE_NAME = ""
Výsledek pak můžeš vidět v příloze kterou přidávám
Kdyz nahravas obrazky k formulari, vlozis formular, pres lastinsert id
zjistis, jake ti priradil id a to pak pouzijes pro ukladani obrazku. Id dalsiho
zaznamu nepotrebujes, kdyz vis posledni, ne?
A jinak s tim docela bacha, pokud nepracujes v transakci a tvuj cyklus
generujici sql dotazy bude dostatecne pomaly, tak pri id+1 id+2 id+3 se muze
stat, ze mezitim jiny script v pameti dela totez a ti tam vlozi zaznam
Cili, vzdycky jit pres
last_insert_id a idealne pres transakce, pokud navysujes id vic nez o +1.
Pokud jde o MySQL, tomuhle přístupu bych se vyhnul.
Proč?
Kdysi jsem ho použil. Fungovalo to krásně, dokonce snad ani nenastala žádná race-condition.
Problém nastal v momentě, kdy jsem přemigroval databázi na novou - verze 8.0
Obsah tabulky information_schema.TABLES jsou totiž jen statistický informace, které nemusí být aktuální.
Viz dokumentace dokumentace :
Columns in TABLES that represent table statistics hold cached values. The information_schema_stats_expiry system variable defines the period of time before cached table statistics expire. The default is 86400 seconds (24 hours). If there are no cached statistics or statistics have expired, statistics are retrieved from storage engines when querying table statistics columns.
Poučný je taky tenhle bug report bug report .
Ten člověk měl úplně stejný problém jako já 
Obcházení pomocí nastavení hodnoty 0 do information_schema_stats_expiry bych taky nedporučoval: Bez toho nastavení ta aplikace nemusí fungovat správně. Takže si to musíš pamatovat, nebo zapsat někam do dokumentace. Pokud podobných specialit vznikne časem více, může z toho být pěkná noční můra.
Pokud ti jde o race condition pri použítí LAST_INSERT_ID, pak dokumentace dokumentace :
For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a nonmagic value (that is, a value that is not NULL and not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns simultaneously from multiple clients is perfectly valid. Each client will receive the last inserted ID for the last statement that client executed.
Pro zajištění, že ti jiný klient neovlivní hodnotu vrácenou funkcí LAST_INSERT_ID() jsou transakce zbytečný (a ani si nejsem jistej, že něco takového zaručují - jsou přeci určeny k něčemu trochu jinému).
Jasne, ale nevim, zda si rozumime.
[b] lze vyresit transakcemi a nebo idealne neco takoveho vubec nedelat. Treba
bys mu poradil neco lepsiho, kdyby popsal problem konkretneji, na prikldu, proc
zrovna toto potrebuje 
Transakce zajistí (doufejme), že se provede všechno, nebo nic. Nezajistí ale, že paralelně nepoběží druhá, ta stejná transakce, která vloží nová IDčka.
Nemám to podložený (možná někdo v dokumentaci to bude), ale myslím si, že transakce nezamkne tabulku pro zápis (možná u myisam tabulek, innodb jsou afaik zamykaný po řádcích).
Nepoléhal bych se tedy na to, že transakce tenhle problém vyřeší.
Problém je v tom, že IDčka by měla přiřazovat databáze, nikoliv hádat, co by tam mělo být ještě před samotným insertem.
Nemá ale moc smysl tohle řešit. Je to jak píšeš, pro nějaký smyslupný návrh to chce od OP detailnější popis.
Tak máš zřejmě pravdu. Teď jsem četl nějakou teorii a tranksace by snad, teoreticky i tenhle případ měla podchytit.
Co se člověk všechno nedoví :/
Zalezi na nastaveni sql. Vetsinou jsou sql prikazy zpusobem
prikaz; commit; prikaz; commit;...
Cili se prikaz ihned odesle do db. Kdyz ale otevres transakci, tak to vypada
takto
Start; prikaz; prikaz; prikaz; commit; end;
A navic, u transakce muzes nastavi, ze kdyz nektery z prikazu selze, tak celou
transakci do db neulozi a spusti nejake jine prikazy, treba ulozi error do
logu.
Zobrazeno 11 zpráv z 11.