Avatar
Wendys
Člen
Avatar
Wendys:

Zdravím všechny, prosím o radu s tabulkou lokální databáze. Když zadám nová data do databaze , tak sloupec ID píše -1;-2;atd. (narůstá do záporných čísel). Pouze když program ukončím a spustím znovu, tak potom v tabulce už je to zapsané správně (3;4;5;atd.) Sloupec ID identity increment nastaveno 1a seed taky 1. Snad jsem to vyvoslil srozumitelně! Díky za váš čas.

 
Odpovědět 21. června 7:27
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

novější verze EF dávají negativní identity id dokud nedojde k uložení do databáze. je možné tedy, že se ti to uklád někde samo při ukončování.. negativní index u identity u objektů se používá poměrně často, aby jsi věděl, že jde o nově vkládaný objekt.

 
Nahoru Odpovědět 30. června 20:02
Avatar
Wendys
Člen
Avatar
Odpovídá na Marian Benčat
Wendys:

Děkuji za odpověď, už jsem myslel, že nikdo nezareaguje. Jde mi o to že, při zadání nového id do tabulky a jeho následného tisku, je místo (např. id145) na listu id-1. A nevěděl jsem, jestli tam mám jenom něco blbě nastavenýho. Ale bude to asi složitější, aby to fungovalo, jak chci. Každopádně děkuji za info!

 
Nahoru Odpovědět 12. července 6:27
Avatar
Wendys
Člen
Avatar
Wendys:

Tak přece nakonec to byl jenom blbě nastavený autoincrement. Nastavoval jsem to jinde, než bylo potřeba. Ale ještě mám jeden problém! Pokud do databáze řádky vkládám, tak ID je o.k. (vždy o jednu větší), ale když poslední řádek vymažu, tak se ID o -1 neodečte a při dalším novým řádku je o jeden větší a místo toho vymazanýho je díra. (1,2,4,5....)

 
Nahoru Odpovědět 26. července 8:51
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Wendys
patrik.valkovic:

Ano, tak databáze pracuje. Na starý id může být nejde odkaz a podobně, proti se nikdy id neopakují.

Nahoru Odpovědět 26. července 8:59
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Honza
Člen
Avatar
Odpovídá na Wendys
Honza:

Pokud je to ID jako primární klíč tak to je v pořádku, ID by se nemělo "recyklovat". Jde totiž o to že v jiné tabulce můžeš mít uloženou nějakou položku s vazbou na ID z té první tabulky (cizí klíč). Pokud bys vymazal záznam např. s ID = 2 a pak tam vložil nějaký úplně jiný záznam zase s ID = 2, vznikla by ti relace se záznamem který ukazoval na tu původní položku před vymazáním a to nedává smysl. Spojily by se ti 2 záznamy které spolu nesouvisejí.

Na SQL serveru to jde nějakým příkazem "setřást" aby tam nebyly ty mezery, ale nevím o nikom že by to v praxi někdo použil. Ty "mezery" jsou standardní a žádoucí chování.

Editováno 26. července 9:02
Nahoru Odpovědět  +2 26. července 9:01
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Wendys
Člen
Avatar
Odpovídá na Honza
Wendys:

Po delší době se zase vracím a popíšu můj problém s databází. Chci si zakládat karty s nějakými údaji do databáze. Ty karty mít očíslované posputně od 1 až..... Myslel jsem, že použiji na číslování karet ID autoincrement, ale mám problém, když poslední kartu vymažu, tak nové číslo karty se o jednu nezmenší, ale pokračuje dál a tím vznikne díra v číslech. Takže takhle to asi nepůjde. Prosím vás o radu nebo hození lasa, jak to vyřešit! Díky.

 
Nahoru Odpovědět 5. října 22:53
Avatar
Honza
Člen
Avatar
Honza:

Ahoj, pokud potřebuješ aby číselná posloupnost byla bez mezer, tak to jde řešit několika způsoby. Nepoužívej autoincrement (ten ti tam při vymazání vytvoří ty mezery), ale vytvoř si ještě jeden sloupec, kde si ty hodnoty budeš dopočítávat sám. A pokud se jejich pořadová čísla nemají opakovat, nezapomeň ho označit jako Uniqe (na SQL serveru to najdeš v indexech).
Pořadové číslo si budeš muset počítat sám, ale musíš si dobře nastavit logiku, protože může nastat několik případů (vkládání na konec, odmazání z prostředku a vznik mezer které budeš muset setřást atd.) Obecně to můžeš řešit buď při vkládání např. pomocí přes T-SQL a nebo v tomto případě by bylo možná lepší použití triggerů.

Můžu se ale zeptat proč ti tam tolik vadí ty mezery? Tohle řešení není úplně standardní a zbytečně si to tím celé komplikuješ. Pořadí záznamů v jakém byly do databáze vloženy získáš seřazením podle primárního klíče (nesmíš samozřejmě používat to "setřesení", popř. si můžeš do nějakého sloupečku vkládat datum a čas přidání záznamu a řadit to podle něj) a jedinečnost záznamů je dána zase primárním klíčem (a to že tam jsou mezery je úplně fuk, důležité je že je unikátní).

Nahoru Odpovědět 6. října 7:40
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Wendys
Člen
Avatar
Odpovídá na Honza
Wendys:

Děkuji za odpověď a vysvětlím to třeba na příkladu seznamu faktur. V databázi jsou uloženy faktury s pořadovými čísly, které se vždy o jedno zvětší, když uložím novou. A potřebuji, aby se při smazání pouze poslední faktury (nikoli někde z prostředka seznamu), pořadové číslo o jedno zmenšilo, aby při další nové faktuře, nebyla v číslech díra. Možná vám připadá můj problém docela malicherný, ale jsem "rookie" a nikde jsem takový tutoriál o databázi, který by tohle řešil nenašel.

 
Nahoru Odpovědět 6. října 8:45
Avatar
Honza
Člen
Avatar
Honza:

Pokud bude povoleno smazání pouze posledního záznamu, tak by to šlo řešit tak jak jsem popisoval. Nepoužívej autoincrement, ale do nějakého sloupce (pokud možno označeného jako unique) si číslo vkládej sám. Vždycky před vložením nového záznamu si vytáhní poslední číslo (SELECT MAX(poradove_cislo) FROM nazevTabulky) a zvyš si ho o jednu.
Popř. to můžeš řešit pomocí triggerů, ale to by sis musel nastudovat, pokud s tím nemáš zkušenosti.

Nahoru Odpovědět 6. října 8:58
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.