Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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

Předmět Autor Datum
PHPMyAdmin je administrátorský nástroj, ne uživatelské rozhraní Cizí klíč je od toho, aby ti nedovo… nový
Jan Fiala 05.04.2016 15:27
Jan Fiala
V podstate do stĺpcov viem zadať aj hodnotu null ale nemôžem tam vložiť viac riadkov jedným príkazom… nový
Petkooo 05.04.2016 17:16
Petkooo
Môžem v tabuľke colors nastaviť aby bol primárny kľúč color_name typu varchar(30)? Ak áno ako? Aby… nový
Petkooo 05.04.2016 17:19
Petkooo
Udelat to samozrejme muzes, ale je to hloupe. Krome toho by mel byt klic typu Char(30), ne VarChar(3… nový
Jan Fiala 05.04.2016 20:02
Jan Fiala
Takže pri zadávaní fariem pri vlajku musím mať pred očami druhú tabuľku s idčkami? Nie je najaký spô… nový
Petkooo 05.04.2016 21:05
Petkooo
Neč. Už jsem ti psal, že PHPMyAdmin není uživatelský nástroj, ale nástroj k administraci DB. Naiš si… poslední
Jan Fiala 06.04.2016 06:41
Jan Fiala

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');

Zpět do poradny Odpovědět na původní otázku Nahoru