Portál AbcLinuxu, 10. května 2025 12:34

Dotaz: nastavení cizího klíče

12.4.2011 16:51 jardík
nastavení cizího klíče
Přečteno: 2002×
Odpovědět | Admin
Hoj, začínám s SQL a není mi jasné, jak v phpMyAdminu klikáním docílit cizí klíč. Našel jsem si návod...

tabulka lekari, atribut umi (index (blesk), char 60) má odkazovat do tabulky odbornosti (odbornosti_nazev je PK, char 60).
Váš SQL-dotaz byl úspěšně vykonán ( dotaz trval 0.2215 sekund )
ALTER TABLE  `lekari` ADD FOREIGN KEY (  `umi` ) REFERENCES  `odbornosti` (  `odbornosti_nazev` ) ;
(návod zmiňoval, že všechny tabulky mají být innoDB, to jsem taky udělal).

No a pak návod hovoří, že si relace prohlídnu v Struktura->Zobrazit relace. Viz obrázek – nic tam nevidím.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

12.4.2011 17:34 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: nastavení cizího klíče
Odpovědět | | Sbalit | Link | Blokovat | Admin
Příloha:
SELECT * FROM `lekari` WHERE `odbornosti`='oční';
:) …, já tam něco vidím… :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.4.2011 17:46 jardík
Rozbalit Rozbalit vše Re: nastavení cizího klíče
díkes ;-)
12.4.2011 20:05 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: nastavení cizího klíče

Není zač :-)

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.4.2011 23:38 jardík
Rozbalit Rozbalit vše Re: nastavení cizího klíče
ještě otázečka na pochopení těch FK:

mám tabulku "ordinace" odkazující ze sloupce "kde" do tabulky "oddeleni" do sloupce "nazev_oddeleni". sloupce jsou typu char. když přejmenuju jednou oddělení bude to problém? Neměl bych odkazovat spíš na "id_oddeleni" v tabulce "oddeleni"? Udělal bych to hned, ale překaží mi v tom fakt, že když mám naplněnou tabulku "oddeleni" daty a pak jdu plnit tabulku "ordinace", tak při vkládání prvku mi to má ukázat ve sloupci "kde" nazev oddeleni, ale ukazuje mi to takhle "id_oddeleni".

Chápu to dobře?
12.4.2011 23:56 jardík
Rozbalit Rozbalit vše Re: nastavení cizího klíče
kamarád mi řekl, že takhle to je pro něj čitelnější, že to předchozí se blbě chápe:

mam DB s tabulkama oddeleni a ordinace. ordinace ma sloupec KDE a odkazuje na tabulku oddeleni. a nevim jestli odkazovat na ID nebo na rovnou nazev_oddeleni...

Děkuji za radu
13.4.2011 00:16 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: nastavení cizího klíče
Dneska jsem byl u zubaře a furt chodím na stejné místo, ale už tam mám 3. zubařku při 4. změně (vrátila se ta první :) ). Adresa/místo (oddělení) furt stejné, ale cedulka (název) na dveřích se pokaždé změnila.
Provázáno to má být přes jednoznačné identifikátory a ve vašem případě by to mělo být přes id.
phpMyAdmin samozřejmě ukazuje sloupec, kterým je to provázáno - zobrazení v aplikaci si už zařídíte tak, jak potřebujete.

přejmenuju jednou oddělení bude to problém
no bude, protože když tam máte definovaný „cizí klíč“, tak Vám to udržuje referenční integritu (hlídá konzistenci) - zkuste si to, co Vám to dovolí :).
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
finc avatar 13.4.2011 09:03 finc | skóre: 8 | blog: Finc | Kolín
Rozbalit Rozbalit vše Re: nastavení cizího klíče
Spíše to vypadá, že by jsi potřeboval trošku více prostudovat návrh databází. Knih a informací na internetu je spousty. Jinak, předpokládám, že se jedná o MySQL. Pokud se jedná o tvorbu cizích klíčů, tak vždy by měla být reference na primární či unikátní klíč, mám pocit, že jinak to ani nelze. Pokud vytvářím cizí klíč, je tento sloupec automaticky i index. Klikání v tom nástroji (osobně ho úplně nesnáším) co používáš asi nebude úplně ideální. Doporučuji se to naučit ručně. Nevím, jestli jsem to správně pochopil, ale ten vztah mezi ordinací a oddělením bych udělal asi takto:
CREATE TABLE oddeleni (
 id int NOT NULL auto_increment,
 nazev varchar(50) NOT NULL,
 PRIMARY KEY(id)
)ENGINE=InnoDB;


CREATE TABLE ordinace (
 id int NOT NULL auto_increment,
 oddeleni_id int NOT NULL,
 nazev varchar(50) NOT NULL,
 PRIMARY KEY(id),
 CONSTRAINT fk_ordinace_oddeleni_id FOREIGN KEY(oddeleni_id)
   REFERENCES oddeleni(id) ON UPDATE CASCADE ON DELETE RESTRICT
)
Pokud již máš hotovou tabulku, tak cizí klíč se přidává třeba takto:
ALTER TABLE ordinace ADD CONSTRAINT fk_ordinace_oddeleni_id FOREIGN KEY(oddeleni_id)
   REFERENCES oddeleni(id) ON UPDATE CASCADE ON DELETE RESTRICT;
Jinak nejlepší je spojovat reference pomocí typu int. Jednak je to nejrychlejší možnost a jednak je problém, že když něco spojuješ pomocí varchar, tak MySQL neřeší definovanou velikost tohoto sloupce, na to bacha. Díky tomu může spojit sloupce s varchar(10) a varchar(20).
Kdo Vam dal pravo ty lidi urazet? A kdo ti dal pravo cumet z okna, ty kr.vo!
13.4.2011 09:33 jardík
Rozbalit Rozbalit vše Re: nastavení cizího klíče
díky moc. já právě nějaký SQL základy mám, ale chtěl jsem se to naučit také v phpMyAdminovi. Díkes
13.4.2011 09:44 jardík
Rozbalit Rozbalit vše Re: nastavení cizího klíče
tak pokud udělám v druhé tabulce primary key to ID a pak se na něj z druhé tabulky odkazuji, tak mi phpMyAdmin nabízí tyto hodnoty (pozn.: mám dva záznamy auto incerement, čili záznam s ID 1 a 2)

http://obrazku.cz/obr676575_png.png
13.4.2011 11:10 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: nastavení cizího klíče
Pokud máte vše zkonfigurováno v phpMyAdmin (což jste podle prvního obrázku neměl), tak si zobrazte 1. tabulk (na tu kterou odkazujete) a v „Zobrazit relace“ si v „Zvolte které sloupce zobrazit“ vyberte 'nazev' (třeba 'odbornosti_nazev').
A pak se podívejte co Vám to zobrazuje při vkládání do druhé tabulky za hodnoty a jak je to setříděné od ½ seznamu nahoru a od ½ dolů - to Vám odpoví na otázku, kterou jste nenapsal… :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.