Autor Zpráva
slower
Profil *
Zdravím, jsem začátečník v Mysql,

potřeboval bych poradit s jednou tabulkou:

CREATE TABLE `tbl_kosik` (
  `kos_id` int(10) unsigned NOT NULL auto_increment,
  `kniha_id` int(10) unsigned NOT NULL default '0',
  `kos_pocet` mediumint(8) unsigned NOT NULL default '1',
  `kos_session_id` char(32) NOT NULL default '',
  `kos_datum` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`kos_id`),
  KEY `kniha_id` (`kniha_id`),
  KEY `kos_session_id` (`kos_session_id`)
) ENGINE=MyISAM AUTO_INCREMENT=58 ;

může mi někdo prosím vysvětlit co znamená KEY ? je to cizí klíč ?


Dočetl jsem se, že primární klíč může být v tabulce jen jeden, mám tu následující kód ve které jsou dva primární klíče a to dost nechápu...

CREATE TABLE `tbl_offer_items` (
  `offer_id` int(10) unsigned NOT NULL default '0',
  `cokolada_id` int(10) unsigned NOT NULL default '0',
  `offer_pocet` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`ob_id`,`kniha_id`)
) ENGINE=MyISAM;

vidíte 2 primary key ? jakto ?

Moderátor Kajman: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Medvídek
Profil
slower:
vidíte 2 primary key ? jakto ?
PRIMARY KEY je složen kombinací sloupců `ob_id`,`kniha_id`
slower
Profil *
aha,
a nevíš na co slouží KEY je to cizí klíč ?
Kajman
Profil
Ne, v tomto případě je to synonym pro vytvoření indexu nad tím sloupcem.
slower
Profil *
a k čemu mi to slouží ten index ?


tak už jsem to našel k čemu slouží ten index, pro lepší a rychlejší vyhledávání v databázi....

chci se ještě zeptat, mám tu hodně tabulek ve kterých jsou tedy primární klíče a tyhle indexi ale nevidím tu žádné cizí klíče ?? je to obchod a tedy nejsou tu žádné propojené tabulky, tak potom nechápu, proč se dělají relace mezi tabulkami ? když ten obchod funguje i bez nich....

Může mi někdo říct k čemu jsou tedy potom ty relace ?
slower
Profil *
Opravdu někdo nevíte kdy mohu použít cizí klíče pro spojení dvou nebo více tabulek ? a kdy je nemusím používat ?
protože mě aplikace jede i bez cizích klíčů a používám spojení inner join mezi tabulkami....a jak pak vypadá spojeni tabulek v MSSQL dotazu když tam mám cizí klíče ? Děkuji pan Bůh Vám to zaplať
Tori
Profil
slower:
nevidím tu žádné cizí klíče
Ty tabulky jsou typu MyISAM, který nepodporuje cizí klíče, na to by (u MySQL) byl potřeba typ InnoDB. Rozdíl je např. při mazání dat - u InnoDB si nadefinujete cizí klíče, a např. při smazání jednoho produktu (oblečení) se zároveň smažou i s ním související záznamy v jiné tabulce (např. dostupné velikosti/barvy). U MyISAM musíte výslovně specifikovat, že chcete smazat data i z té další tabulky (příkaz DELETE pro více tabulek, je to podobná syntax jako při spojování tabulek pro SELECT).

Obecně, pokud máte např. tabulky a (id, název, ...) a související tab. b (id, id_a = vazba na tab.A, cizí klíč, ...) a používáte často dotaz SELECT * FROM a INNER JOIN b ON a.id = b.id_a, tak zřejmě máte primární klíče na sloupcích a.id a b.id, a přidáte si index i na sloupec b.id_a. Nalezení souvisejících řádků z obou tabulek se pak může řešit jen pomocí indexů, místo aby databáze porovnávala všechny položky z a se všemi z b, a dotaz se provede výrazně rychleji.
slower
Profil *
Tori:
aha, já jsem nechápal rozdíl mezi spojování tabulek bez cizího klíče nebo s cizím klíčem, teď už to konečně chápu, že existuje i nějaký jiný typ tabulky jako je InnoDB pro spojení s cizím klíčem. Díkes
Tori
Profil
slower:
rozdíl mezi spojování tabulek bez cizího klíče nebo s cizím klíčem
Jsem to napsala asi trochu nejednoznačně. Cituji: „Cizí klíč: Sloupec nebo skupina sloupců v jedné tabulce, která odpovídá kandidátnímu klíči některé (případně téže) tabulky.(Conolly, Begg, Holowczak: Mistrovství - databáze, s. 67, CPress 2009) Existence cizích klíčů tedy nezávisí na použitém typu DB, ale vznikají během logického návrhu databáze a při spojování tabulek se používají (imho) v naprosté většině případů. Rozdíl je v tom, zda je konkrétní typ DB schopen "vnímat" související data z různých tabulek jako jediný celek (objekt) nebo ne.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: