Diskuze: Parcialita v MySQL

Ostatní jazyky SQL SQL a databáze Parcialita v MySQL

Avatar
Marthyn
Člen
Avatar
Marthyn:

Poradí někdo jak se dá nastavit parcialita v MySQL potažmo phpMyAdmin?

Jde mi o to, že bych rád vytvořil pomocí cizího klíče vztah 1:0(N) mezi tabulkami.

Příklad: Jeden člověk může být majitelem jednoho nebo více aut, ale zároveň nemusí být majitelem žádného.

Zkoušel jsem povolit u daného indexu aby mohl mýt nulový, ale nepomohlo. (Odkoukáno z MySQL Workbench).

Má někdo nějaký návrh jak na to? Díky

Editováno 7.4.2015 22:31
 
Odpovědět 7.4.2015 22:31
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marthyn
David Čápka:

Když povolíš NULLový, tak to normálně funguje. JEslti ti to nejde, tak tam máš nějaký vadný záznam, který má takový klíč, který se jako primární klíč v druhé tabulce nevyskytuje.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 7.4.2015 22:45
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
shaman
Člen
Avatar
Odpovídá na Marthyn
shaman:

Foreign key musi byt uplne rovnaky typ ako index na ktory ho chces naviazat.
Taktiez by mal byt null.
a nezabudni ho spravit aj unsigned ak to davas na klasicky numericky primary key.

Nahoru Odpovědět 8.4.2015 0:50
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Odpovídá na shaman
Martin Konečný (pavelco1998):

Dotaz - proč unsigned? Já si nikdy nezvykl dávat polde ID jako unsigned int. Mám pocit, že jsem někde naopak četl, že to může dělat problémy.

 
Nahoru Odpovědět 8.4.2015 12:02
Avatar
d4rkw34v3r
Člen
Avatar
d4rkw34v3r:

Ty si někdy dával jako identifikator záporný číslo? :-)

 
Nahoru Odpovědět  +1 8.4.2015 12:07
Avatar
shaman
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
shaman:

auto increment je standardne 1 ak si ho nenastavis na ine (pozitivne) cislo. Taktiez sa neda v SQL nastavit negativne autoincrement. Dokonca nevidim zmysel preco. Phpmyadmin nepouzivam ale ine SQL klienty ti tam automaticky nastavia unsigned, aby si vedel ulozit viac riadkov.

Dovod? Ak mas integer id tak max hodnota je 2,147,483,647. Dve miliardy zapornych hodnot na id nikdy nevyuzijes. Ale s unsigned vies ulozit vyse 4 miliard moznych riadkov do tabulky.

Z toho dovodu, casto ked mi nejde nastavit foreign_key tak je problem prave unsigned.

Nahoru Odpovědět 8.4.2015 14:59
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Odpovídá na shaman
Martin Konečný (pavelco1998):

Já vím, že díky unsigned se zvýší maximální kladná hodnota, ale myslím, že jsem někde četl, že se to i přes to nedoporučuje, protože to může dělat v něčem problémy.
Bohužel si už nepamatuji, kde jsem to četl, takže odkaz nemohu poslat.

Já naopak snad ani v žádných řešeních neviděl při vytváření tabulky, aby ID bylo unsigned, proto se ptám.

 
Nahoru Odpovědět 8.4.2015 15:28
Avatar
Odpovídá na shaman
Michal Štěpánek:

V podstatě by se s tím dalo souhlasit, ale upřímně: dokážeš si představit tabulku, kde jsou 4 miliardy záznamů? Abych pravdu řekl, já si nedokážu představit ani ty dvě miliardy, jak by se s tím pracovalo...

Nahoru Odpovědět 8.4.2015 16:51
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
shaman
Člen
Avatar
Odpovídá na Michal Štěpánek
shaman:

http://www.statisticbrain.com/…-statistics/ fejsbuk ma 1.3mld pouzivatelov treba sa fejsbuku opytat ci ich maju v autoincrement tabulke s unsigned, alebo uz o par rokov nebudu mat kde davat novych zakaznikov. :)

Pointa je ale od zaciatku v tom ze som chcel poukazat ze ak ti nejde nastavit foreign key tak moze byt aj toto problem.

Na zaver si skusme predstavit este tabulku ktora ma id nastavenu tinyinteger, teda od -127 do 128. Tam sa ti uz unsigned asi aj zide a budes vediet ulozit az 255 riadkov. To ale nie je pointa. Dalej si predstavme ze foreign key bude tiez tinyinteger ale nebude unsigned. Je jasne ze do riadku s rozsahom -127 az 128 nevies ukladat hodnoty s rozsahom 0 az 255, takze ti SQL proste vypise ze foreign key na tieto dve polia nevie nastavit.

Nahoru Odpovědět 8.4.2015 17:30
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Marthyn
Člen
Avatar
Odpovídá na David Čápka
Marthyn:

Ano díky, mám tam někde nejspíš vadný záznam, protože v testovací tabulce vše funguje jak má.

Napadl mě ale ještě jedne poddotaz. Co když bych chtěl vytvořit vtah 0(1):0(N).

Když to uvedu zase na stejném příkladu, tak bych chtěl uvést že žádný člověk nemusí být majitelem auta, protože je majitelem firma.

Ve Workbench tato vazba jde nastavit, ale už tam nedokážu odkoukat co se změnilo v těch tabulkách, respektive to vypadá, že se nezměnilo nic.

 
Nahoru Odpovědět 8.4.2015 21:01
Avatar
Marthyn
Člen
Avatar
Odpovídá na Marthyn
Marthyn:

Teď jsem se do toho zamotal, možná je škoda, že nejde najít článek který by se parcialitou zabýval a klidně by mohl rozvést myšlenku s unsigned...

V každém případě, pokud přemýšlím správně, tak vztah 0:N dostanu v mém případě, když vytvořím řádek automobil s NULLovým id_clovek. Takže možnost ve Workbench, slouží pouze jako možnost grafického znázornění. Mýlím se?

 
Nahoru Odpovědět 8.4.2015 21:35
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.