Autor Zpráva
FantomX1
Profil
Mohli by ste mi prosim niekto poradit na co presne sa pouziva v databaze MySQL klucove slovo FOREIGN KEY?

Nie som si isty ci viem presne kedy sa ma pouzit. Ale myslim si ze sa pouziva vtedy, ked chceme urcit urcity vztah medzi dvoma tabulkami. Napriklad mame tabulku hry, ta ma vela stlpcov pre mnozstvo dat, jednym zo stlpcov hry je aj stlpec vyrobca. Predpokladajme ze jedna hra moze mat len jedneho vyrobcu, aj ked v skutocnosti to moze byt aj inak. Tak mame tabulku vyrobcovia, ktora ma stlpce poradove cislo vyrobcu=ID a nazov vyrobcu. A preto aby sme sa lahsie dostali k tymto udajom dame polozke(stlpcu) vyrobca h tabulke hry vlastnosti INT a NOT NULL ako je aj v tabulke vyrobca a urcime stlpcu vyrobca v tabulke hry FOREIGN KEY REFERENCES vyrobcovia (ID), to preto aby sme sa lepsie vedeli dostat k udajom v tabulke vyrobcovia a vedeli vybrat odtial jeden nazov vyrobcu pre nasu hru.
Je tam teda vztah N:1 jeden vyrobca moze mat vyrobenych mnoho hier ale jedna hra moze mat len jedneho vyrobcu. Podla toho mozeme zistit, ze ktory vyrobca vyrobil ake hry. Ale stale mi nejde do hlavy ci to FOREIG KEY a REFERENCES je tam vlastne nutne aby to tam bolo? Nedalo by sa to aj bez toho FOREIGN KEY? A mohli by ste mi niekto blizsie vysvetlit ako presne to funguje?

Vopred dakujem za vysvetlenie.
Leo
Profil
FOREIGN KEY se da pouzit u tabulek typu InnoDB, ne u MyISAM. Slouzi k omezeni manipulace s daty z ruznych tabulek, ktera jsou vzajemne propojena a k zachovani intregrity. To co pisete se da normalne aplikovat bez FOREIGN KEY. Ten slouzi treba k tomuhle: mate tabulku pobocek a tabulku zamestnancu pobocek, a chcete aby se pri smazani pobocky automaticky 1, smazali vsichni zamestnanci z dane pobocky, nebo 2, se u nich jako hodnota ve sloupci pobocka nastavilo NULL atd. Leo
thingwath
Profil
Jedna z věcí které mě na MySQL štvou je, že některé vlastnosti umí jenom pro některé druhy tabulek :-(
FantomX1
Profil
Dakujem Leo, myslim ze to uz zacinam chapat, takze to automaticky vymaze udaje z tabulky zamestnanci pobocky ktore uz nemaju asociaciu s nijakym prvkom stlpca z tabulky pobocky.

Len by som rad vedel ze co to presne spravi Leo, ci to vymaze celeho zamestnanca, alebo tomu zamestnancovi len vymaze id pobocky, pre ktoru pracuje. Je to podla mna dost dolezite, pretoze neskor mozno budeme chciet toho zamestanca zaradit do inej pobocky a preto nie je potrebne vymazavat ho.

A ako mam nastavit tabulke jej typ ze ci bude typu InnoDB alebo MyISAM, predpokladam ze sa to urcit da alebo nie?

To thingwath

No ak sa da zvolit typ tabulky, tak si zvolime tu co pre nas lepsie vyhovuje nie? Odtialto to vypada tak ze tabulka InnoDB ma viacej moznosti, ale iste ma aj nejake nevyhody oproti MyISAM.

Inac dakujem za vysvetlenie Leo.
thingwath
Profil
Vybrat správný druh tabulky může být problém. Jinak se to píše do CREATE TABLE, přesně jak se to dělá je v manuálu, já tyhle věci z hlavy prostě nevím :-) Tuším, že to vypadá nějak
CREATE TABLE xyz ( int x) type=MyISAM;
Leo
Profil
"Len by som rad vedel ze co to presne spravi Leo, ci to vyaze celeho zamestnanca, alebo tomu zamestnancovi len vymaze id pobocky, pre ktoru pracuje."

To se musi nastavit u toho klice co se ma stat, napriklad se muze nastavit i to, ze takto svazane zaznamy nejdou vubce mazat / aktualizovat, nebo se ty zavisle smazou, nebo se jim nastavi NULL.... Je tak klauzule ON DELETE SET NULL apod. Leo
Leo
Profil
"tabulka InnoDB ma viacej moznosti, ale iste ma aj nejake nevyhody oproti MyISAM"

Napriklad - mam pocit - u ni nejde nastavit fulltext, Leo
Leo
Profil
Jinak

http://dev.mysql.com/doc/mysql/en/innodb-foreign-key-constraints.html

Leo
zby
Profil *
Create table `tb` () type=innodb;
Create table `tb` () engine=innodb;

Pro cizí klíče, tedy "FOREIGN KEYS" MUSÍ být všechny závislé tabulky InnoDB a "rodičovské" sloupce indexovány pro rychlejší ověřování, jinak se tabulka s constrainty nevytvoří. Také podporuje kaskádové mazání atp.

Jak Leo uvedl, ano, InnoDB skutečně nepodporuje fulltext indexy.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0