Autor | Zpráva | ||
---|---|---|---|
grimword Profil |
#1 · Zasláno: 6. 12. 2008, 02:15:37
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 |
#2 · Zasláno: 6. 12. 2008, 08:54:01
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 |
#3 · Zasláno: 6. 12. 2008, 10:20:04
„(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é. |
||
Časová prodleva: 4 měsíce
|
|||
fatality Profil * |
#4 · Zasláno: 15. 4. 2009, 22:40:35
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 |
#5 · Zasláno: 15. 4. 2009, 23:27:14
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 |
#6 · Zasláno: 16. 4. 2009, 07:30:29
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 |
#7 · Zasláno: 16. 4. 2009, 08:18:29
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 |
#8 · Zasláno: 16. 4. 2009, 08:34:22
nightfish
On se tu znova zeptal fatality ... |
||
Joker Profil |
#9 · Zasláno: 16. 4. 2009, 09:58:16
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 |
#10 · Zasláno: 16. 4. 2009, 10:37:39 · Upravil/a: imploder
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 |
#11 · Zasláno: 16. 4. 2009, 11:02:17
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 * |
#12 · Zasláno: 16. 4. 2009, 17:00:45
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
|
||
Časová prodleva: 15 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0