

Oprava číslování auto_increment
Mám v databázi MySQL tabulku se sloucem 'id' int(1) NOT NULL auto_increment, kam se mi ukládají data z formuláře.
Než jsem to stačil udělat, byl 20x vyplněn. Z těch dvaceti je ale 5 řádků úplně prázdných.
Chtěl bych ty prázdné odstranit a přečíslovat ID 1-15. Ale potřeboval bych, aby další ID bylo 16, ne 21, protože to ukazuje počet odeslaných formulářů.
Dá se to nějak?
Autoinkrement přečísluješ jedině překopírováním celé tabulky (lépe řečeno appendem do prázdné). Autoinc pole slouží hlavně pro vazby s jinýma tabulkama a tam je nežádoucí přečíslování při vyhození záznamu uvnitř, muselo by se přečíslovat i v závislých tabulkách. Nemůžeš počet formulářů zjistit počtem vět v tabulce (funkce count v selectu)?
Já si to myslel. Vyexportuji do *.sql, upravím v PSPadu a vložím (asi možná snad).
Pokud je pole autoincrement, pak je nemuzes vkladat do tabulky - SQL server ti to nedovoli. Vlozis zbytek poli mimo autoincrement a on si to ocisluje sam.
Pokud chces AutoIncrement k pouzivat k necemu jinemu nez jen jednocnacne ID v ramci tabulky, tak ho zrus a udelej to jinak. Naprosto nevhodny je napr. pro vazby mezi tabulkami apod.
no neviem, ale ja osobne polia kde je automaticke cislovanie pouzivam napriklad ked mam strukturu Hlavicka-polozky.
Tabulka s hlavickou obsahuje jedno ID (auto_increment) + nejake dalsie...polozky obsahuju stlpec ID (auto_increment) + ID_hlavicky + nejake dalsie stlpce. Nie je na tom nic tazke, ani chybove, treba len vediet ako to pouzit
A az jednou budes muset sehravat doklady budes v haji...
Nerozumiem, prečo by bol v háji. Keď nemajú dáta v tabuľke nejaký prirodzený primárny kľúč (čo je skoro vždy), vytvorí sa umelý pomocou poľa typu auto_increment. Väzby medzi tabuľkami sa viažu na primárny kľúč tabuľky. Takže použitie auto_incrementu je hlavne na väzby medzi tabuľkami.
K pôvodnej otázke: Opravovať hodnoty v poli typu auto_increment je v tomto prípade zbytočné. Počet riadkov sa zisťuje pomocou select count(*) (prípadne sa uchováva taká informácia niekde inde) a nie podľa maximálnej hodnoty auto_incrementu.
Predtav si, ze mam tabulku, kde je hlavicka dokladu ID typu identity (autoincrement)
Polozky dokladu jsou navazane na ID
Dosud je to vse v poradku
Ted si predstav, ze takove systemy mam 2 a potrebuju sehravat data
Kdyz prihraju doklady, zmeni se mi ID a tezko budu resit precislovani ID u polozek dokladu, ktere sehravam...
sposob pre MS SQL:
samozrejme vacsina systemov ma okrem automatickeho cislovania aj vygenerovane cislo dokladu, v pripade, ze by si chcel okrem vkladania z jedneho systemu do druheho robit aj synchronizaciu dokladov. Vazba je vsak uplne normalne cez primary key.
Jasne, ze existuje zpusob, ale podivej se, kolik prace navic mas jen kvuli tomu, ze jsi pouzil identity na vazbu mezi tabulkami.
A ted si predstav, ze doklady vytvaris, prenasis nekam, kde mohou vznikat i nove doklady a puvodni se ti meni a pak to zase musis dat dohromady.
To uz by pak tak jednoznacne nebylo, protoze bys ztratil ID radku a tezko by ses napojoval na puvodni data.
Pouzit identity na propojeni mezi tabulkami je sice jednoduche, ale muze se ti to nepekne vymstit...
nemyslim, ze som urobil nejaku pracu naviac. Ten kurzor by si musel pouzit tak ci tak, ked chces robit synchronizaciu typu insert/update. Vo worku taketo operacie robime a nie je s tym ziadny problem. Takych kurzorov ti za hodinu napisem aj 100
Keby to nebol autonumber, tak ten identifikátor musí niekto vymyslieť - to je tiež práca navyše. IMHO je jednoduchšie rozdeliť rozsahy tak, aby sa medzi viacerými systémami tie identifikátory nebili, prípadne doplniť k primárnemu kľúču nejaké ID systému.
Sehrávat znamená akože zlúčiť dohromady? T.j. synchronizovať tak, aby v oboch systémoch boli rovnaké dáta? To sa robí často tak, že sa v jednom systéme generujú párne identifikátory a v druhom nepárne - potom sa to spája jednoducho.
Párne a nepárne? To akože liché a sudé?
Skôr sudé a liché.
Edit: V angličtine a češtine má preklad slova "párne" párny počet znakov a "nepárne" nepárny počet znakov. Len v slovenčine to tak vďaka dvojznakovej predložke nie je...
zato ale z vyznamu slova je jasne o co ide :)
parne - tvori par a par su vzdy 2 (a kazdy vie ake cislo je 2)
neparne - opak parneho
sposob pre mysql
neviem co konkretne tym myslis, ale ak mi napises presnejsie co znamena to sehravat, tak ti napisem sposob, akym to spravit.
Priklad je uvedeny vyse
Jo možná jsem na to přišel. S auto_increment nic dělat nebudu, ale jen smáznu ty prázdné a u výpisu výsledků udělám místo
něco jako
Ale z hlavy to nevím, jdu studovat.
Tak mám to tady
www.prepis.cun.cz
prázdné řádky jsem vymazal. Teď bych ale potřeboval u toho výpisu, aby ona čísla byla 1-21, ne 1-36 jako to je v současnosti.
Nejde to udělat nějakou proměnnou, že se tam dá místo
něco jako
?
Áno, na číslovanie riadkov vôbec nepotrebuješ používať pole typu auto_increment. Stačí dať na začiatku $radek = 0; (alebo ak to nie je prvá strana, tak počet_riadkov_na_stranu * číslo_strany). V cykle potom vypisuješ <?=++$radek ?>.
To je super díky moc. Přesně tak jsem to myslel. Hele jak jsem se s tím porval
www.prepis.cun.cz
A teď mohou být ID jaká chtějí. Já je třeba tady stejně na nic jiného nepoužíval.
Značím za vyřešené.
Super. Tie IP spolu s ďalšími informáciami by som ale takto radšej nezverejňoval.
Teď když jsem to tu vykecal, tak je smáznu ono o tom vědělo jen 5 lidí co to organizují. Já je tam dal aby byl přehled když byly ty prázdné, jestli je to z následující (neumí poslat formulář), nebo všechny ze stejné (robot)...
@Krata:
vytvori si tabulku (uplne rovnaku ako ta kde mas data)....prehod si do nej riadky z tej povodnej, ktore chces ponechat.
povodnu tabulku truncatni - TRUNCATE TABLE table_name;
Prehod data naspat. Dropni pomocnu tabulku.
Tol bylo druhé co mne napadlo. Udělat to vlastně "růčo". Jenže pokud existuje něco co udělá proměnnou na každém novém řádku o jednu větší (a věřím že ano), je to vlastně zbytečné.
Vyhnu se tím situaci, kdy by se zase objevil nějaký prázdný formulář (i když úplně prázdné už nejdou), protože pak bych to zase musel předělávat. S přibývající proměnnou ne.