Autor Zpráva
grimword
Profil
Mam v tabulce sloupec 'id', ktery se pri kazdem dalsim zaznamu zvysi o +1, smazu-li nejaky radek, logicky mi bude chybet jedna hodnota 'id' (1,3,4,5), existuje nejaky prikaz, jednoducha funkce, ktera by mi v MySQL prepsala 'id', tak aby byla zachovana matematicka posloupnost jako pred smazanim? (projela vsechny radky a prepsala jejich 'id')
Pajah
Profil
V PHP by to udělat šlo...
$id=2;
$dotaz=mysql_query("DELETE FROM tabulka WHERE `id`='$id'"); //tohle je ten tvůj dotaz
$dotaz2=mysql_query("UPDATE tabulka SET id=id-1 WHERE id > $id"); //to upraví id všech záznamů "nad" tím smazaným

Podle mě je to ale celkem zbytečné. :)
joe
Profil
(projela vsechny radky a prepsala jejich 'id')

Když budeš mít v tabulce milion záznamů a jeden odebereš, vážně chceš aby jsi kvůli tomu měnil 999 999 řádků?

Navíc co když odebereš z prostředka?

Nepřemýšlej o tom, je to zbytečné.
fatality
Profil *
já bych chtěl udělat, že když smažu určitýho uživatele, tak novej dostane jeho id....takže když budu mít třeba 10 uživatelů s id 1-10, a smažu 6, tak bude id 6 volný, tak bych chtěl script, kterej mi projede tabulku s id, a najde volný, šlo by to nějak?
ninja
Profil
Proc chcete znovu pouzivat stejna ID? Proc vadi, ze jsou v rade diry? To nemate ty ID navazane na dalsi tabulky? Nerozhodi se vam vazby? Opravdu myslite, ze je dobre uzivatele skutecne mazat, nikoliv jen oznacit za "smazane"?
imploder
Profil
ninja
To nemate ty ID navazane na dalsi tabulky? Nerozhodi se vam vazby?
Pochopil jsem to tak, že chce zjišťovat první volné ID pro registraci dalšího uživatele a když se nějaký z těch existujících smaže, tak aby se díra po něm využila. A vyhledat tu první volnou pozici přímo pomocí SQL. Něco jako "vrať 1. ID odzdola, které v tabulce není". Taky nevím jak to udělat a jestli to SQL umožňuje.

Ale jak se teď dívám, pochopil jsem to špatně. Grimword zřejmě opravdu chce měnit po smazání ID už existujících uživatelů.

Opravdu myslite, ze je dobre uzivatele skutecne mazat, nikoliv jen oznacit za "smazane"?
Když nějaký uživatel nechce, aby byly údaje o něm nadále uloženy v databázi (např. má pocit, že mu to narušuje soukromí), tak by ho asi naštvalo, že se nemůže doopravdy smazat (kdyby to věděl). A ušetří se tím místo na disku. Kdyby se uživatel smazal omylem a chtěl to vrátit, tak pak by zase už nemohl.
nightfish
Profil
je otázkou, jestli po 4.5 měsících grimword vaše odpovědi ocení a jestli to už náhodou nějak nenaimplementoval
Mastodont
Profil
nightfish
On se tu znova zeptal fatality ...
Joker
Profil
fatality
já bych chtěl udělat, že když smažu určitýho uživatele, tak novej dostane jeho id
Bomba, takže příspěvky, zprávy, nastavení, všechno co předtím patřilo tomu smazanému uživateli, bude teď navázané na toho nového.

Výsledek bude asi podobný, jako kdyby se všichni lidi identifikovali jen přes nějaké "univerzální rodné číslo" a současně by se čísla zemřelých lidí znovu přidělovala nově narozeným.

imploder
Pochopil jsem to tak, že chce zjišťovat první volné ID pro registraci dalšího uživatele a když se nějaký z těch existujících smaže, tak aby se díra po něm využila
Ale proč!?
V 99,999% případů to nepřinese absolutně žádné výhody, naopak to přinese nevýhody. Neexistuje rozumný důvod, proč to dělat.
Pokud je potřeba do tabulky vložit víc záznamů, než kapacita datového typu použitého pro ID, není nutné recyklovat stará ID, ale použít pro ID datový typ s větším rozsahem. Nemyslím si, že by někdo z diskutujících někdy využil celý rozsah UNSIGNED BIGINT, tj. cca 18,5 trilionu (= 10^18) hodnot.
A vůbec nejlepší je takový druh "optimalizátorů", který se snaží recyklováním starých IDček šetřit číselnou řadu, čímž se co do paměti obvykle neušetří nic, ve výjimečných případech použitím menšího datového typu jeden bajt na záznam, zatímco do vedlejšího sloupce narvou datum jako VARCHAR(10), čímž vyplýtvají 8 bajtů na záznam.
imploder
Profil
Joker
Bomba, takže příspěvky, zprávy, nastavení, všechno co předtím patřilo tomu smazanému uživateli, bude teď navázané na toho nového.
To se stane, pokud se v procesu odstranění uživatele všechny věci patřící tomu uživateli nevymažou. Nj, není to moc bezpečné, může se na něco zapomenout, může nastat chyba během mazání + navíc u některých dat může být žádoucí, aby tam zůstaly (třeba i proti vůli daného uživatele). Takže radši to opravdu nedělat.
Joker
Profil
imploder
To se stane, pokud se v procesu odstranění uživatele všechny věci patřící tomu uživateli nevymažou.
Přesně. To je jednak praktický problém: prakticky nelze zaručit, že se v celém systému zlikvidují všechny stopy po smazaném uživateli. No a pokud se do toho zamíchají i nějaké externí systémy, je to vpodstatě neřešitelný problém.

Ale je to i problém teoretický: Ve většině případů (IMHO) smazání uživatele není jako u Orwella- "Je to neuživatel. Neexistuje. Nikdy neexistoval". Spíš to je změna stavu- uživatel není aktivní, ale pořád je záhodno evidovat, že někdy existoval a v systému vykazoval nějakou aktivitu.
fatality
Profil *
j, máte pravdu...to asi bude lepší když si v administraci vytvořim update podle id, a přepíšu uživatele na něco jako smazáno
Toto téma je uzamčeno. Odpověď nelze zaslat.