Autor | Zpráva | ||
---|---|---|---|
dmn Profil |
#1 · Zasláno: 24. 6. 2009, 10:20:42 · Upravil/a: dmn
Jak lze zjistit relaci sloupce v tabulce na sloupec v jiné tabulce? (php, mysql)
Udělal jsem formulář, pomocí kterého lze editovat (přidat, upravit, smazat) vesměs jakoukoliv tabulku (myšleno záznamy v tabulce, tedy řádky). Problém mám při možnosti přidat: vytvoří se inputbox pro každý sloupec, event. s defaultní hodnotou apod. Pokud je ovšem relace na 'jinou tabulku', rád bych z 'jiné tabulky' (konkrétního sloupce, na který je vazba) nabral možné hodnoty a nabídl je formou selectu. Vše ostatní zde zmíněné je vcelku jasné a bezproblémové. Jediné, kde jsem uvízl, je zjištění relace. Za radu jakéhokoliv způsobu (více či méně fundamentálního) budu rád. Závěrem podotýkám, že dělám univerzální řešení, proto nelze vytvářet pomocný seznam relací apod. Snad jsem problém popsal dost jasně, na případné dotazy rád odpovím. Děkuji za Vaší snahu |
||
Kajman_ Profil * |
#2 · Zasláno: 24. 6. 2009, 10:41:28
Zkuste
show keys from `tabulka` |
||
dmn Profil |
#3 · Zasláno: 24. 6. 2009, 12:01:03 · Upravil/a: dmn
Vyzkoušel jsem, ale bohužel z navrácených informací jsem nevyčetl potřebnou informaci. Ani v dokumentaci, kde jsou hodnoty popsané, jsem nenalezl potřebné (viz http://dev.mysql.com/doc/refman/6.0/en/show-index.html). Momentálně elaboruji s http://dev.mysql.com/doc/refman/6.0/en/key-column-usage-table.html, ale zatím bez výsledku.
|
||
Aesir Profil |
#4 · Zasláno: 24. 6. 2009, 12:27:40 · Upravil/a: Aesir
dmn:
„Jak lze zjistit relaci sloupce v tabulce na sloupec v jiné tabulce?“ Vyparsovat z SHOW CREATE TABLE „Momentálně elaboruji s http://dev.mysql.com/doc/refman/6.0/en/key-column-usage-table.html, ale zatím bez výsledku.“ Tam se bohužel nedozvíte o navázaných akcích na události (ON UPDATE, ON DELETE, apod.). |
||
Kajman_ Profil * |
#5 · Zasláno: 24. 6. 2009, 14:40:14
dmn
Pokud tam máte cizí klíče, tak by v information_schema.KEY_COLUMN_USAGE měly být k nalezení. |
||
dmn Profil |
#6 · Zasláno: 24. 6. 2009, 14:57:08
Aplikoval jsem dotaz SHOW CREATE TABLE (viz příspěvek uživatele Aesir), ale bohužel v navráceném výsledku se mi nepodařilo najít informaci o relaci (možná jsem jen 'slepý', kdyby někdo měl odzkoušeno, podělte se o vědomosti).
V INFORMATION_SCHEMA jsem se skutečně potřebné nedověděl. Zatím největší pokrok je SELECT col FROM tab PROCEDURE ANALYSE(), kde výsledek mimojiné obsahuje záznam z navázané tabulky, ovšem pouze jeden. Pokud by dotaz vracel všechny záznamy z příslušného sloupce navázané tabulky nebo jméno tabulky v relaci, byla by má potřeba vyřešena. |
||
dmn Profil |
#7 · Zasláno: 24. 6. 2009, 15:04:10
„dmn“
„Pokud tam máte cizí klíče, tak by v information_schema.KEY_COLUMN_USAGE měly být k nalezení.“ Pomocí KEY_COLUMN_USAGE se v mém případě dovím pouze název sloupce, který je primárním klíčem pro danou tabulku. V podstatě by to mohlo postačovat za předpokladu, že by na sebe byly navázány pouze sloupce primárních klíčů. |
||
Aesir Profil |
#8 · Zasláno: 24. 6. 2009, 15:23:42
dmn:
„Aplikoval jsem dotaz SHOW CREATE TABLE (viz příspěvek uživatele Aesir), ale bohužel v navráceném výsledku se mi nepodařilo najít informaci o relaci “ A jsou ty relace vyjádřené cizími klíčy nebo ne? Pokude ne, tak asi jedině zkusit odhadnout relaci na základě nějaké jmenné konvence primárních klíčů a tabulek, ale o spolehlivosti bych v tom případě moc nemluvil ;) |
||
dmn Profil |
#9 · Zasláno: 24. 6. 2009, 15:34:06
Upřímně, relace jsem vytvářel pomocí nějakého grafického návrháře v phpmyadmin tak nevím, jakým způsobem jsou vyjádřené. Samozřejmě bych nerad zpochybňoval spolehlivost, tématice se věnuji neprofesionálně, proto jsem uvedl to, co jsem uvedl.
|
||
Aesir Profil |
#10 · Zasláno: 24. 6. 2009, 17:55:42
dmn:
„Upřímně, relace jsem vytvářel pomocí nějakého grafického návrháře v phpmyadmin tak nevím, jakým způsobem jsou vyjádřené.“ A v phpmyadminovi to nějak poznáte, že tam relace je? |
||
dmn Profil |
#11 · Zasláno: 24. 6. 2009, 18:43:32
V phpmyadmin při zobrazení struktury tabulky je volba zobrazit relace (relation view). Tato funkce zobrazí dvousloupcovou tabulku relací aktuálně zvolené tabulky vůči dané databázi (první sloupec obsahuje názvy sloupců tabulky a ve druhém sloupci lze pomocí selektu zvolit relaci k jiné tabulce). Dále je možné relace vytvářet, sledovat a upravovat pomocí jakéhosi návrháře (grafické rozhraní). Musím ovšem podotknout, že ani jeden způsob není úplně transparentní v tom smyslu, co člověk vytváří (alespoň dle mého názoru).
|
||
Aesir Profil |
#12 · Zasláno: 24. 6. 2009, 22:56:55
dmn:
Tak jsem si zázračného phpmyadmina nainstaloval, debianí balíček obsahoval verzi 2.11.9.3 (nakolik je aktuální nevím) a v něm nástroj "Zobrazit relace" vytváří opravdu cizí klíče a opravdu jsem je přes SHOW CREATE TABLE Možná jste se koukal na špatnou tabulku? |
||
dmn Profil |
#13 · Zasláno: 25. 6. 2009, 01:53:12
Nevím jakým záhadným způsobem, ale vytvořil jsem vlastní klíče. Zkusím tedy vytvořit cizí klíče a identifikovat je pomocí SHOW CREATE TABLE. Zatím díky za rady, až odzkouším, dám vědět.
|
||
Kajman_ Profil * |
#14 · Zasláno: 25. 6. 2009, 09:12:23
A neukládá si pma někam do svých tabulek nakreslené relace, když se použijí myisam tabulky, které cizí klíče nepodporují? Zdrojáky pma by mohly pomoci záhadu vyřešit..
|
||
Aesir Profil |
#15 · Zasláno: 25. 6. 2009, 09:21:23
Kajman_:
„A neukládá si pma někam do svých tabulek nakreslené relace, když se použijí myisam tabulky, které cizí klíče nepodporují? Zdrojáky pma by mohly pomoci záhadu vyřešit..“ Přesně z toho důvodu jsem to zkusil nainstalovat - u myisam ten nástroj není vůbec nabízen. |
||
dmn Profil |
#16 · Zasláno: 25. 6. 2009, 17:29:03
Děkuji všem za rady a projevenou snahu! Dobracování se k vysněnému konci:
1) tabulky jsem měl typu myisam, který nepodporuje cizí klíče -> ALTER TABLE tab ENGINE = innodb 2) pracuji lokálně s balíkem xampp lite, který defaultně nepodporuje innodb -> potřeba upravit nastavení v my.cnf 3) SHOW CREATE TABLE skutečně zobrazuje potřebné informace ... FOREIGN KEY (`col`) REFERENCES `tab` (`col`) ... Ještě jednou díky za pomoc... |
||
dmn Profil |
#17 · Zasláno: 25. 6. 2009, 17:56:43
Doplnění: pro tento účel lze použít i INFORMATION_SCHEMA.KEY_COLUMN_USAGE:
[TABLE_SCHEMA] => db [TABLE_NAME] => tab [COLUMN_NAME] => col [REFERENCED_TABLE_SCHEMA] => db [REFERENCED_TABLE_NAME] => tab [REFERENCED_COLUMN_NAME] => col |
||
Časová prodleva: 15 let
|
0