logo
24.12.2018 16:54
1
Mam tabulku kde mam integer stlpec ktory je unique a vkladam do nej zaznamy kde potrebujem zaistit to ze nevlozim zaznam ktory by preskocil ciselny rad(cize 1,2,3 -> 5..)

Prakticky vzate - ak mam v tabulke zaznamy 1, 2, 3 tak nemozem vlozit 5,6,7 ale musi tam byt 4. Samozrejme vlozit 5, 4 ,6 mozem lebo v konencom dosledku dosiahnem 1,2,3,4,5,6.

Prakticky tie ID pochadzaju z inej DB a ja musim zachovat postupnost, to je cele.

Zaujimalo by ma ci je mozne toto zaistit nejakym matematickym vzorcom, idelane aplikovatelnym priamo na db(sql)?

Nieco ako ze si spocitam vsetky idcka(1+2+3+4+5=15) a nejakym vzorcom si z toho vypocitam ci mi tam chyba nejake cislo alebo nie.

Zatial robim len primitivnu kontrolu, mimo inych, if (total > 1 && (max - min) != (total-1)) exit ale prakticky by som musel robit loop a kontrolovat sekvenciu manualne, co sa da v aplikacii ale chcel by som aj nieco na db.

Co se právě děje na Webtrhu?

24.12.2018 23:07
2
Píšeš, že ty identifikátory pocházejí z externího zdroje, a že je ti jedno, v jakém pořadí se zapíší.
Proč tedy prostě ta data nevkládat v pořadí, v jakém přicházejí, a při čtení je neseřadit?

ORDER BY external_id ASC

Co je to za externí zdroj? Co budeš dělat, až pošle data mimo pořadí? Tvé aktuální řešení se při první chybě (5, 4, 6) navždy zasekne.
24.12.2018 23:40
3
Zle si pochopil. Nejde mi o radenie zapisu ale o to aby sa nestalo ze mi bude chybat nejaka sekvencia(1,2,3,5,6,9). Inak povedane, nie je mozne do db zapisat riadok bez toho aby uz v db existoval iny riadok s id-1. Skratka ak chcem zapisat riadok s ID 5 tak v db uz musi byt riadok s ID 4, ak chcem zapisat ID 25698 tak v db uz musi byt 25697.
25.12.2018 00:54
4
//Jsem asi de*il který to nepochopil.

Ale není na tohle AUTO_INCREMENT?
25.12.2018 01:42
5
Původně odeslal Bogdan
//Jsem asi de*il který to nepochopil.

Ale není na tohle AUTO_INCREMENT?
to sme asi debili dvaja kedze autoimcrement mi tiez napadol ako prve...

ale ak ide autorovi o to ze ma na vstupe uz nejake id ktore chce vkladat tak to potom Node sprav tak ze si vytvoris storovanu procedúru do ktorje ako parametre das id a zvysne stlpce a v ramci procky si spravis select na id-1 a ak take id existuje tak commit a return true, inak false.
otazka este je ako chces aby sa to spravalo ak uz take id v DB mas...
25.12.2018 20:06
6
Rád bych poradil, ale nerozumím.
Máš tabulku, s unikátním celočíselným sloupcem (řekněme id), a současně nechceš používat auto_increment, a v té tabulce mohou být "díry" (např. po smazaných záznamech) a potřebuješ najít nejmenší id, které chybí?
How do I find a "gap" in running counter with SQL? - Stack Overflow
25.12.2018 22:43
7
posledny pokus o vysvetlenie, lebo som to po sebe cital niekolko krat a inak to uz vysvetlit naozaj nejde.
takze v principe ide o to ze nemozem urobit insert do tabulky v pripade ze by som chcel vlozit data ktore po vlozeni nemaju kontinualny ciselny rad. skratka append-only. ak prebehne pokus o insert dat ktore nenadvezuju priamo na uz existujuce data tak musi transakcia fejlnut.

v praxi ide o to ze mam N databaz ktore su SPOT. Kazda z nich reprezentuje unikatny namespace ale strukturou su data totozne. Samozrejme si kazda radi data cez auto-increment. Ja potrebujem agregrovat data zo vsetkych tychto databaz kvoli tomu ze potrebujem odbremenit tie db a mat centralnu db ktora sa bude skalovat a bude urcena na citanie. a tym ze v tejto centralnej db nemozem pouzit auto-increment, ale musim 100% zarucit poradie zaznamov, tak musim riesit to aby som nevlozil data mimo poradia a tym padom som podal prakticky invalidne data konzumentom. ak producent ma napriklad 100 zaznamov a mne pride 1-50 a potom znovu 1-50 tak mam stale len tych unikatnych zoradenych 1-50. ak mi producent posle zaznamy 75 az 100 tak to ignorujem lebo mi chyba 51 az 74, takze aj ked producent uz ma 100 zaznamov, ja mozem naservirovat konzumentom len zaznamy 1-50.

tl;dr kafka
26.12.2018 10:26
8
toto tazko urobis cisto v DB, toto je biznis logika ktoru by som mal radsej v samotnej aplikacii na tvojom mieste..

1. z DB by som vybral najvacsiu hodnotu integer stlpcu ( SELECT MAX(stlpec) AS max_stlpec FROM tabulka )
2. pripocital + 1
3. zistil ci v prichadzajucich datach tato hodnota existuje ak ano ulozil ju a dalej iteroval s + 1..
4. pri neexistencii fail a koniec..

co sa tyka vzorcov:
spravnu sekvenciu overis napr. funkciou range

range( min($pole_s_hodnotami), max($pole_s_hodnotami) ) === $pole_s_hodnotami // porovnat ci su polia rovnake

resp. si spocitat sucet: array_sum(range( min($pole_s_hodnotami), max($pole_s_hodnotami) )) === array_sum($pole_s_hodnotami) // ak nie je dodrzane poradie v $pole_s_hodnotami