Autor Zpráva
ja.cz
Profil *
Ahoj,
mám takové dva dotazy...

1) Jaký je rozdíl mezi PRIMARY KEY a INDEX, krom toho, že v INDEXu se mohou nacházet duplicitní hodnoty?
2) Na Wikipedii jsem se dočetl, že PRIMARY KEY může být v tabulce maximálně jednou a INDEX může být nastaven pro více sloupců. Ale pak jsem našel další článek na Martanek.net, kde je to předně naopak. Doufám, že jsem to teda správně pochopil, je tam např. takto založená tabulka:
Create table `utulek_zviratka` (
`id` Int NOT NULL AUTO_INCREMENT, 
`type_id` Int NOT NULL, 
`home_id` Int NOT NULL, 
`name` Varchar(30) NOT NULL,
`type_note` Varchar(30), 
`note` Text, 
`obr` Varchar(30) DEFAULT 'neni.jpg', 
`created_date` Datetime, 
Index `AI_id` (`id`),    
Primary Key (`id`,`type_id`,`home_id`)) ENGINE = MyISAM;


Můžete mi to prosím objasnit kde je "zakopanej pes"? :-)
Děkuji
Kajman_
Profil *
Primární klíč může být skutečně jen jeden, ale může být na více sloupcích jako v příkladu (tedy kombinace použitých sloupců musí být v tabulce vždy jedinečná).

Indexů může být více (ty také mohou být i vícesloupcové) a používají se, protože mohou pomoci při optimalizaci dotazů.

http://www.linuxsoft.cz/article.php?id_article=912
ShiraNai7
Profil
Primární klíč je primární klíč a index je index... u tabulky může být více primárních klíču (myšleno více sloupců pod jedním) a unikátnost je pak brána podle všech primárních sloupců dohromady (podle jejich unikátních kombinací). Primární k. by měly být použity pouze pro sloupce které jsou přímo spojeny s identifikací daného řádku v databázi.
ja.cz
Profil *
Jo táák... už tomu, dá se říci, rozumím. Děkuji.
Ale i přesto mám další otázku. Nebudu otevírat nové téma, protože to spolu souvisí, takze se snad administrátoři nebudou zlobit. :)

V ukázce co jsem sem nakopíroval, je použit u tabuky INDEX i PRIMARY KEY na sloupec `id`, jaky to má význam?

A potom jsem narazil ve článku na http://www.linuxsoft.cz/article.php?id_article=912, že popisují 4 druhy indexu.
1-Ordinální index - klasický INDEX
2-Primární klíč - primární klíč tedy PRIMARY KEY
3-Fulltextový index
a pak ještě
4-Jedinečné indexy - jeslti to dobře chápu, tak toto je UNIQUE KEY? Já jsem ale myslel, že UNIQUE není index, protože ho nevytváří. Nebo se celou dobu pletu?
_es
Profil
ja.cz:
U primárneho kľúča automaticky vzniká jedinečný (unikátny) index.
ja.cz
Profil *
_es
Teď nevím, na co přesně reaguješ. Vím že u primárního klíče vzniká index tabulky a je unikátní, proto jsem se ptal proč je v ukázce použit INDEX i PRIMARY KEY na sloupec `id`
_es
Profil
ja.cz:
Primárny index je v ukážke pre trojicu stĺpcov, čo znamená, že sa vo všeobecnosti použije, ak sú známe hodnoty všetkých troch stĺpcov.
Teda ak je zadaná hodnota len napríklad type_id stĺpca, a zvyšné stĺpce zadané nie sú, tak sa nevyužije.
Niekde som čítal, že by mal byť taký index v MySql využiteľný pre n-tice: (`id`), (`id`,`type_id`), (`id`,`type_id`,`home_id`).
No neviem, nakoľko to je isté. A ak aj áno, tak je možno ten extra index rýchlejší.
A ten extra index je tuším nutný pre AUTO_INCREMENT.
Kajman_
Profil *
ja.cz:
proč je v ukázce použit INDEX i PRIMARY KEY na sloupec `id`

To se zeptejte autora ukázky, my tam smysl nevydumáme.

Pro filtrování pomocí id lze použít složený primární klíč, protože id v definici úplně vlevo. Index by měl větší smysl, kdyby byl na type_id a někdy se hledalo podle tohoto sloupce bez použití id. Nebo obdobně na dalších sloupcích.
ja.cz
Profil *
Tak vám tedy oběma pěkně děkuji, už mám z toho pěkně zamotanou hlavu :) ale je to lepší než na začátku!
Takže, jestli mohu INDEX i PRIMARY KEY uzavřít a laicky říci, že: PRIMARY KEY vytváří v tabulce primární klíč a zároveň její index a INDEX jako takový slouží také pro indexaci tabulky a zároveň pro zrychlení práce s daty v tabulce při vyhledávání apod. (když je tedy PRIMARY KEY vícesloupcový)

A ještě mi nedá, abych si neujasnil jednu věc na kterou jsem se ptal ve čtvrtém příspěvku. Na linuxsoft.cz je jeden z indexů označený jako jedinečný klíč. Jedná se o UNIQUE KEY nebo o něco jiného? Myslel jsem si, že UNIQUE KEY nevytváří index tabulky, takže nechápu proč by byl zařazený mezi indexy? děkuji :)
_es
Profil
ja.cz:
Na linuxsoft.cz je jeden z indexů označený jako jedinečný klíč. Jedná se o UNIQUE KEY“?
Áno. Jedinečný = unikátny: v tabuľke nebude možné v tom stĺpci vytvoriť dve rovnaké hodnoty. Každý riadok bude mať v tom stĺpci inú hodnotu.

Myslel jsem si, že UNIQUE KEY nevytváří index tabulky
PRIMARY KEY je zároveň aj UNIQUE KEY a vždy sa pritom zároveň vytvorí aj index - pri oboch týchto kľúčoch.
Indexy sú užitočné okrem vyhľadávania aj pri zoraďovaní výsledných záznamov.
ja.cz
Profil *
_es
Joj, já jsem to předtím pochopil špatně. Už jsem si vyhledal další materíály, kde je to podrobněji popsané. A je to prakticky to samé co jsi teď napsal. Takže děkuji za čas tech, co se mi snažili poradit.
Děkuji!
martanekx
Profil *
Ahoj,

ten článek jsem psal já. Jenom rekapitulace toho, co tě asi zajímá:

1. Na některých sloupcích se vytváří index, pro PK sloupec se index vytváří automaticky. Index je tam z důvodu, aby se záznamy dalo podle této hodnoty rychle vyhledávat. Jedná se o index typu B-tree = neni pro fulltextové vyhledávání.

2. PK může být na více sloupcích. Jedná se jen o ukázku toho, že záznam v tabulce může být identifikován více než jedním sloupcem, pokud je pro to dobrý důvod. Daty by teoreticky stačil pro PK jen sloupec ID. Já jsem ale chtěl jít dál: řekl jsem si, že budu chtít identifikovat psa v útulku podle toho, kde je ten pes "ubytován" a případně co je to za rasu = typ. Mám tedy type_id a home_id a chci identifikovat v DB psa. Tento dotaz mi vybere možná několik psů a dle dalších popisů a vlastností vyberu toho správného. = Přijdu na jeho ID, které ten pes samozřejmě nikde na sobě napsané nemá. A tím PK na 3 sloupcích si vynutím to, že když budu psát poznámku k psovi, tak u toho musím také zadat jeho typ a ID ubytování. To je něco jako prevence proti chybám.

Jednalo se o případ, kdy ta klientská aplikace je hloupá, tak aby se zamezilo aspoň nějakým chybám ze strany DB. Od toho tam právě jsou ty uložené procedury. V ideálním případě by samozřejmě ta klientská aplikace měla být chytrá a pak si půlku funkcí u té DB můžeme odmyslet, protože prostě nebudou potřeba. V rámci toho článku jsem jasně říkal, že věci jako uložené procedury by se moc používat neměly, protože by se to mělo rozumně řešit na straně aplikace a ne až na straně DB, kde ty možnosti kontroly dat jsou už podstatně menší.

Martin

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:

0