
MySQL, phpmyadmin, cudzí kľúč
Vytvoril som si databázu, definoval cudzie kľúče a naplnil ju údajmi (mám dva problémy)
CREATE DATABASE flag_colors;
-------------------------------------------------- -----
CREATE TABLE colors (
color_id INT NOT NULL AUTO_INCREMENT,
color_name varchar(30),
PRIMARY KEY(color_id)
);
CREATE TABLE flags (
flag_id INT NOT NULL AUTO_INCREMENT,
flag_name varchar(30),
color_one int,
color_two int,
color_three int,
PRIMARY KEY (flag_id),
FOREIGN KEY(color_one) REFERENCES colors(color_id),
FOREIGN KEY(color_two) REFERENCES colors(color_id),
FOREIGN KEY(color_three) REFERENCES colors(color_id)
);
INSERT INTO `colors`(`color_name`) VALUES ("white"), ("blue"), ("red"), ("yellow"), ("green");
INSERT INTO `flags` (`flag_id`, `flag_name`, `color_one`, `color_two`, `color_three`) VALUES
(NULL, 'slovakia', '1', '2', '3'),
(NULL, 'czech republic', '1', '2', '3'),
(NULL, 'hungary', '3', '1', '5');
-------------------------------------------------- -----
Problém 1:
Chcel by som aby sa mi v phpMyAdmin-e pri vkladaní údajov do tabuľky flags, stĺpcov color_one/two/three
ponúkali možnosti z tabuľky colors stĺpca color_name namiesto color_id. Problém je v tom, že neviem ako
spraviť aby stĺpce color_one/two/three nadobúhadli hodnoty zo stĺpca color_name, pretože aj keď zmením dátový
typ na varchar() namiesto int nefunguje mi to. Viem spraviť zo stĺpca color_name varchar(30) primárny kľúč?
Problém 2:
Pri vkladaní údajov do tabuľky flags musím vyplniť všetky polia ktoré odkazujú na cudzí kľúč, ja by som chcel,
aby mohli obsahovať aj prázdnu hodnotu, napríklad:
(NULL, 'poland', '1', '3', ''),
(NULL, 'ukraine', '1', '4', ''),
(NULL, 'austria', '1', '3', '')
Ďakujem za každú radu
PHPMyAdmin je administrátorský nástroj, ne uživatelské rozhraní
Cizí klíč je od toho, aby ti nedovolil zadat nic jiného, než obsahuje tabulka, na kterou cizí klíč odkazuje. Právě kvůli tomu to slouží. Pokud tam chceš prázné hodnoty, tak vytvoř sloupce, které umožňují vložit NULL a NULL tam vkládej.
Další možnost je, že do tabulky barev vložíš záznam, který bude obsahovat barvu s číslem nula. Ale nemůžeš vkládat do pole typu celé číslo (int) řetězec - ''. Prázdný řetězec je řetězec, ne číslo.
V podstate do stĺpcov viem zadať aj hodnotu null ale nemôžem tam vložiť viac riadkov jedným príkazom ak neobsahujú hodnoty null v rovnakých stĺpcoch, lebo ak definujem že chcem niečo zadať do stĺpcov color_one, color_two a color_three tak musím nejakú hodnotu z druhej tabuľky.
TOTO MÔŽEM SPRAVIŤ:
INSERT INTO `flags` (`flag_name`, `color_one`, `color_two`, `color_three`) VALUES
('slovakia', '1', '2', '3'),
('czech republic', '1', '2', '3'),
('hungary', '3', '1', '5');
TOTO NEMÔŽEM:
INSERT INTO `flags` (`flag_name`, `color_one`, `color_two`, `color_three`) VALUES
('poland', '1', '3', NULL),
('ukraine', '2', '2', NULL);
('hungary', '3', '1', '5');
ALE TOTO BY SOM MOHOL /hodnoty NULL budú v stĺpci kde nič nevkladám/
INSERT INTO `flags` (`flag_name`, `color_one`, `color_two`) VALUES
('poland', '1', '3'),
('ukraine', '2', '2');
Tým sa dá považovať problém dva za vyriešený
Môžem v tabuľke colors nastaviť aby bol primárny kľúč color_name typu varchar(30)? Ak áno ako?
Aby som mohol vložiť namiesto tohto:
INSERT INTO `flags` (`flag_id`, `flag_name`, `color_one`, `color_two`, `color_three`) VALUES
(NULL, 'slovakia', '1', '2', '3');
toto:
INSERT INTO `flags` (`flag_id`, `flag_name`, `color_one`, `color_two`, `color_three`) VALUES
(NULL, 'slovakia', 'biela', 'modra', 'cervena');
Udelat to samozrejme muzes, ale je to hloupe. Krome toho by mel byt klic typu Char(30), ne VarChar(30).
Prace s int typem je mnohem rychlejsi a taky zabira mnohem mene mista v tabulce.
Prave proto se to dela tak, jak jsi to mel navrzene prvne.
Takže pri zadávaní fariem pri vlajku musím mať pred očami druhú tabuľku s idčkami? Nie je najaký spôsob aby som vedel zadať farbu a nahodilo mi to idčko?
Neč. Už jsem ti psal, že PHPMyAdmin není uživatelský nástroj, ale nástroj k administraci DB.
Naiš si vlastní rozhraní s formulářem pro zadávání v libovolném jazyku a tam si to pak můžeš zadávat formou, jaká ti vyhovuje.