Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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?

Předmět Autor Datum
Autoinkrement přečísluješ jedině překopírováním celé tabulky (lépe řečeno appendem do prázdné). Auto…
Rce 18.06.2009 02:11
Rce
Já si to myslel. Vyexportuji do *.sql, upravím v PSPadu a vložím (asi možná snad).
Kráťa 18.06.2009 02:59
Kráťa
Pokud je pole autoincrement, pak je nemuzes vkladat do tabulky - SQL server ti to nedovoli. Vlozis z…
Jan Fiala 18.06.2009 07:51
Jan Fiala
nevhodny je napr. pro vazby mezi tabulkami apod. no neviem, ale ja osobne polia kde je automaticke…
wam_Spider007 18.06.2009 18:00
wam_Spider007
A az jednou budes muset sehravat doklady budes v haji...
Jan Fiala 18.06.2009 18:43
Jan Fiala
Nerozumiem, prečo by bol v háji. Keď nemajú dáta v tabuľke nejaký prirodzený primárny kľúč (čo je sk…
los 18.06.2009 19:21
los
Predtav si, ze mam tabulku, kde je hlavicka dokladu ID typu identity (autoincrement) Polozky dokladu…
Jan Fiala 18.06.2009 19:49
Jan Fiala
sposob pre MS SQL: DECLARE @ID INT, @NEW_ID DECLARE XCUR CURSOR FOR SELECT ID FROM DOKLADY OPEN XCU…
wam_Spider007 18.06.2009 19:54
wam_Spider007
Jasne, ze existuje zpusob, ale podivej se, kolik prace navic mas jen kvuli tomu, ze jsi pouzil ident…
Jan Fiala 18.06.2009 20:09
Jan Fiala
nemyslim, ze som urobil nejaku pracu naviac. Ten kurzor by si musel pouzit tak ci tak, ked chces rob…
wam_Spider007 18.06.2009 20:14
wam_Spider007
Keby to nebol autonumber, tak ten identifikátor musí niekto vymyslieť - to je tiež práca navyše. IMH…
los 18.06.2009 20:39
los
Sehrávat znamená akože zlúčiť dohromady? T.j. synchronizovať tak, aby v oboch systémoch boli rovnaké…
los 18.06.2009 19:55
los
Párne a nepárne? To akože liché a sudé?
host 18.06.2009 20:57
host
Skôr sudé a liché. :-p Edit: V angličtine a češtine má preklad slova "párne" párny počet znakov a "…
los 18.06.2009 21:01
los
zato ale z vyznamu slova je jasne o co ide :) parne - tvori par a par su vzdy 2 (a kazdy vie ake cis…
wam_Spider007 18.06.2009 21:07
wam_Spider007
sposob pre mysql DECLARE _ID INT; DECLARE XCUR CURSOR FOR SELECT ID FROM DOKLADY; OPEN XCUR; BEGIN…
wam_Spider007 18.06.2009 19:58
wam_Spider007
neviem co konkretne tym myslis, ale ak mi napises presnejsie co znamena to sehravat, tak ti napisem…
wam_Spider007 18.06.2009 19:27
wam_Spider007
Priklad je uvedeny vyse
Jan Fiala 18.06.2009 19:49
Jan Fiala
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…
Kráťa 18.06.2009 12:40
Kráťa
Tak mám to tady www.prepis.cun.cz prázdné řádky jsem vymazal. Teď bych ale potřeboval u toho výpisu,…
Kráťa 18.06.2009 17:52
Kráťa
Áno, na číslovanie riadkov vôbec nepotrebuješ používať pole typu auto_increment. Stačí dať na začiat…
los 18.06.2009 19:25
los
To je super díky moc. Přesně tak jsem to myslel. Hele jak jsem se s tím porval :-) www.prepis.cun.cz…
Kráťa 18.06.2009 21:11
Kráťa
Super. Tie IP spolu s ďalšími informáciami by som ale takto radšej nezverejňoval.
los 18.06.2009 21:15
los
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 d… poslední
Kráťa 18.06.2009 21:24
Kráťa
@Krata: vytvori si tabulku (uplne rovnaku ako ta kde mas data)....prehod si do nej riadky z tej pov…
wam_Spider007 18.06.2009 18:03
wam_Spider007
Tol bylo druhé co mne napadlo. Udělat to vlastně "růčo". Jenže pokud existuje něco co udělá proměnno…
Kráťa 18.06.2009 18:14
Kráťa

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)?

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.

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 :-)

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:

DECLARE @ID INT, @NEW_ID
DECLARE XCUR CURSOR FOR
SELECT ID FROM DOKLADY

OPEN XCUR

FETCH NEXT FROM XCUR INTO @ID

WHILE @@FETCH_STATUS = 0
BEGIN
  INSERT INTO DOKLADY_SYSTEM2 (POLIA)
  SELECT POLIA
  FROM DOKLADY
  WHERE ID = @ID

  SET @NEW_ID = SCOPE_IDENTITY()  -- taktiez mozes pouzit @@IDENTITY

  INSERT INTO POLOZKY_SYSTEM2 (DOKLAD_ID, POLIA)
  SELECT @NEW_ID, POLIA
  FROM POLOZKY
  WHERE DOKLAD_DID = @ID

  FETCH NEXT FROM XCUR INTO @ID
END

CLOSE XCUR

DEALLOCATE XCUR

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 :-)

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

<?php echo $zaznam["id"]; ?>

něco jako

<?php echo $zaznam["očíslovaný počet nalezených řádků"]; ?>

Ale z hlavy to nevím, jdu studovat.

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

Zpět do poradny Odpovědět na původní otázku Nahoru