Pro sloupce, které mohou mít hodnotu jen z povolené množiny, je v MySQL k dispozici typ ENUM. Osobně se tomuto typu nebráním a ve vhodných situacích ho používám. Určitě je přehlednější stav ENUM('na skladě', 'vyprodáno', 'předobjednávka')
než stav CHAR(1)
s možnými hodnotami S
, V
a P
.
<?php // nejasná data v databází a nepřehledný kód $result = mysql_query("SELECT nazev, stav FROM vyrobky"); while ($row = mysql_fetch_assoc($result)) { echo "<li>$row[nazev] - "; switch ($row["stav"]) { case "S": echo "na skladě"; break; case "V": echo "vyprodáno"; break; case "P": echo "předobjednávka"; break; } echo "</li>\n"; } mysql_free_result($result); // využití typu ENUM $result = mysql_query("SELECT nazev, stav FROM vyrobky"); while ($row = mysql_fetch_assoc($result)) { echo "<li>$row[nazev] - $row[stav]</li>\n"; } mysql_free_result($result); ?>
Pokud se možné hodnoty sloupce mohou rozšiřovat nebo pokud se k nim mohou vztahovat další informace, je lepší pro ně vytvořit speciální tabulku (někdy se jí říká číselník). Místo skupina ENUM('Televize', 'Videa', 'Rádia')
je tedy určitě lepší vytvořit tabulku skupiny(id INT, nazev VARCHAR(50))
a odkazovat se na ni přes skupina INT
.
<?php $result = mysql_query(" SELECT vyrobky.nazev, skupiny.nazev AS skupiny_nazev FROM vyrobky INNER JOIN skupiny ON vyrobky.skupina = skupiny.id "); while ($row = mysql_fetch_assoc($result)) { echo "<li>$row[nazev] - $row[skupiny_nazev]</li>\n"; } mysql_free_result($result); ?>
Podle sloupce typu ENUM se v MySQL bohužel nedá spolehlivě třídit. Vyřešit se to dá myslím používáním kódu ORDER BY 1*typ
, ale bohužel to nemohu ověřit, protože se mi chybu již nedaří reprodukovat. Pokud se ENUM použije v kontextu čísla (tedy např. ono 1*typ
), použije se jeho číselná hodnota – 1 pro první hodnotu, 2 pro druhou a tak dále. Do každého sloupce typu ENUM lze uložit prázdný řetězec, kterému odpovídá číslo 0. Ten se použije také při pokusu o uložení neplatné hodnoty.
Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.
Diskuse je zrušena z důvodu spamu.