Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Zelený je lopuch,
fotbal to je hra...

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Archiv klubu Database (mysql,...) [ŽP: neomezená] (kategorie Programování) moderuje melkor_unlimited.
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
   
[ 414 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
tessien Tessien Of course slavery is the worst thing - that ever happened. But maybe... 29.12.2005 13:04  252
Takovehle veci se obvykle resi pomoci triggeru (netusim ale, jestli je MySQL uz umi) - udela se trigger, kterej reaguje na INSERTy, UPDATEy a DELETEy v tabulce1 a podle toho upravi hodnoty v tabulce2.

Nicmene obecne vzato neni moc dobra praktika, mit v DB takhle duplikovana data - je potreba zvazit, ze tam tu denormalizovanou formu skutecne potrebujes.
anywherehome 29.12.2005 12:09  251
konkrétně mi jde o to, aby (asi primární klíč) sloupec tabulky2 odpovídal prvnímu sloupci (primárnímu klíči) tabulky1
anywherehome 29.12.2005 11:49  250
zdravim,
sem úplný začátečník...
jak pls vytvořit tabulku v databázi mysql, aby hodnoty sloupce tabulky2 kopírovaly hodnoty sloupce tabulky1, a to aby se tabulka2 automaticky při změně tabulky1 updatovala?
díky
(kokrétně jsem na mysql.wz.cz)
mach 28.11.2005 23:46  247
AL3X: Super, diky!
al3x 27.11.2005 13:16  246
UNION dava radky 'pod sebe'. To, co jsem napsal je dava 'vedle sebe'. Nevim, jestli je to presne to, co chces.
al3x 27.11.2005 13:15  245
select * from tabulka1 outer join tabulka2 using(id)?
mach 27.11.2005 13:14  244
Kdyz mam dve tabulky s takovymi sloupci:

tabulka1: id | sloupec_a | sloupec_b
tabulka2: id | sloupec_c

Tak jde vytvorit SQL dotaz, ktery by vzal radky z obou techto tabulek, seradil by je podle id a jednotlive radky toho vysledku by vypadaly treba takhle (priklad pro pripad, kdy je ten radek z prvni tabulky):

id = 3
sloupec_a = nejaka_hodnota
sloupec_b = dalsi_hodnota
sloupec_c = NULL (protoze v tabulka1 sloupec_c neni)

UNION jednak muzu pouzit jen pokud jsou pocty sloupcu stejne a navic nezachova jmena sloupcu (pro druhy sloupec - ten za id - pouzije jmeno treba sloupec_a a tam hodi prvni sloupce z obou tabulek - tedy sloupec_a a sloupec_c).
al3x 24.11.2005 15:45  243
Ach jo. Vubec si me tu nevsimejte. Zkusim se nejdriv naucit cist nez budu neco takovyho plkat. Mel jsem celou dobu pocit, ze prosazujes uplne jiny reseni (ktery jsem cetl nekde na webu a - nevim proc - nejak jsem si ho spojil s tebou).
Mno nic, tak sry.
bredy 24.11.2005 14:47  242
Al3XTo co píšeš jsem nepochopil. Zadání bylo nalézt náhodný záznam. Pokud záznamy v tabulce mažeš pomocí DELETE, tak bys neměl narážet na nesmazané záznamy, protože jejich počet je za každých okolností 0. Pokud mažeš záznamy tak, že si je označíš, tak by se samozřejmě oba selekty musely opravit, aby pracovali pouze se záznamy, které nejsou označené jako smazané. V tom případě by COUNT(*) už neměl složitost 1, ale složitost v nejhorším případě N (pokud je v indexu, tak je to lepší, například jedna má implementace BTree umí zjistit počet záznamu v zadaném indexu taky v jednotkovém čase - takže předpokládám, že u MYSQL je to ještě lépe optimalizované).

Problém, který toto řešení má, je to, že když mezi SELECT COUNT(*) a SELECT LIMIT vymaže záznam a náhodou ti padne náhodné číslo vyšší, než současný počet záznamů v tabulce, který se změnil po tom, co jsi udělal dotaz na počet. To že se mažou záznamy mimo tuto část nevadí.
al3x 24.11.2005 13:45  241
Bredy [240]: To ano, ale ne vsechny databaze jsou pouzivany jen jako staticke archivy. Operace mazani neni nic zas tak neobvykleho. I pokud si predstavim hloupej priklad tabulky, ktera si pamatuje vypujceny knihy v knihovne, tak hned narazim. Ta tabulka sice bude mit radove stale stejnej pocet radek (vypujcenych knih), ale protoze se bezne vrati stejne knih (delete) jako se jich pujci (insert), predpokladame-li, ze prumerna vypujcni doba je jeden mesic, tak kazdym mesicem klesa pravdepodobnost, ze se tim svym algoritmem nekam trefis na 1/n, kde n je pocet mesicu, kdy je ta db v provozu.
Za rok provozu budes muset udelat pres deset selectu, aby jsi nasel zatim nesmazanej radek.

Ale je to elegantni reseni, kdyz to budes odevzdavat, tak na pokusnych datech pujde vse v pohode. Jen casem se jim to bude zadrhavat vic a vic, ale to uz te nezajima, protoze jsi svuj produkt uz davno prodal..
bredy 24.11.2005 13:29  240
AL3XProblém nastává jen v okamžiku, kdy někdo z tabulky záznam smazal a zrovna náhodné číslo vrátilo hodnotu mimo rozsah počtu záznamů. I kdyby tam byl velký provoz, pravdepodobnost je malá.

Mimochodem, technika opakování výpočtu v konkurenčním prostředí se používá dost často i v jiných oblastech. Často také proto, že je mnohdy rychlejší, než vytvářet zámky a transakce. Není na tom nic špatného. Předpokládá se přitom, že ke kolizi nedochází až tak často. V níže uvedením případě je kolize pouze ve vyjmenovaných situacích a tedy tvrdím, že tuto podmínku to splňuje.
tvx tvx Myslet si, že svět je JEN takový, jak - ho v daný čas můžeme pochopit je hloupé. 23.11.2005 08:59  239
huhdiky, o diky, replace mezeru za nic me nejak nenapadlo...
al3x 23.11.2005 01:01  238
huh [237]: To je fakt. Ale stejne mi to reseni moc nesedi. Hlavne proto, ze neni univerzalni, jakmile to budu delat nad tabulkou, ktera se casto meni, tak to muze delat dost osklivy veci. Navic na to prijdes az po roce pouzivani systemu a ne hned, protoze ze zacatku se budes trefovat dobre. Proste hnus.
huh huh 23.11.2005 00:31  237
AL3X [235]: to poznas, protoze tu nulu vrati uz COUNT
huh huh 23.11.2005 00:26  236
tvx [233]: odstranit mezery lze treba pomoci fce REPLACE(); vyhledat podretezec umi treba funkce INSTR() nebo LOCATE(); nepises co za db, tak predpokladam mysql

[ 414 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt