MySQL Tahák

Primary a Foreign Key

Tato stránka obsahuje informace o Primary a Foreign klíčích.

PRIMARY KEY

Primární klíč je sloupec nebo více sloupců, které jednoznačně definují položku v tabulce. Pokud nějaký sloupec označíme jako PRIMARY KEY, tak pro každou položku v tabulce musí být v tomto sloupci unikátní hodnota. Pro jednu tabulku můžeme vytvořit jen jeden primární klíč.

Vytvoření primárního klíče

Primární klíč můžeme vytvořit dvěma způsoby. První je ten, že při vytváření tabulky přidáme za sloupce text 'PRIMARY KEY' a za něj do závorky sloupec, který chceme použít jako primární klíč.

CREATE TABLE users
(
    id INT NOT NULL,
    username VARCHAR(30),
    email VARCHAR(320),
    PRIMARY KEY (id) # použití sloupce id jako primárního klíče
);

Druhý způsob je ten, že za sloupec, který chceme použít jako primární klíč napíšeme text 'PRIMARY KEY'.

CREATE TABLE users
(
    id INT NOT NULL PRIMARY KEY, # tento sloupec se použije jako primární klíč
    username VARCHAR(30),
    email VARCHAR(320)
);

Vytvoření primárního klíče z více sloupců

Pokud chceme, tak můžeme jako primární klíč použít i více sloupců. Potom nebudeme v tabulce moci mít dvě položky, které mají ve sloupcích, které se používají jako primární klíč stejné hodnoty. Pokud ale budou mít třeba jen jeden sloupec stejný, tak v tabulce mohou být. Pro použití více sloupců jako primární klíč je jen oddělíme při vytváření tabulky čárkou.

CREATE TABLE likes
(
    user_id INT NOT NULL,
    photo_id INT NOT NULL,
    PRIMARY KEY (user_id, photo_id) # použití více sloupců jako primární klíč
);

Automatické zvyšování hodnoty

Primární klíč většinou v tabulce používáme jako unikátní identifikátor položky. Většinou u každé položky chceme mít nějaké unikátní číslo, které jí přiřadíme při jejím vložením do tabulky. O to, aby bylo číslo pro každou položku unikátní bychom se samozřejmě mohli starat mimo MySQL, ale je mnohem lepší když se to za nás bude řešit automaticky. Pokud za nějaký sloupec při vytváření tabulky napíšeme slovo 'AUTO_INCREMENT', tak se nám hodnota ve sloupci bude automaticky zvyšovat když do tabulky přidáme novou položku.

CREATE TABLE users
(
    id INT NOT NULL AUTO_INCREMENT, # hodnota v tomto sloupci se bude automaticky zvyšovat
    username VARCHAR(30),
    email VARCHAR(320),
    PRIMARY KEY (id)
);

FOREIGN KEY

Foreign key slouží k napojení jedné tabulky na druhou. Použijeme jej, když například budeme chtít v tabulce chtít odkazovat na položku v jiné tabulce pomocí jejího identifikátoru. Foreign key nám jednoduše zamezí ukládat do sloupce, který oznažíme jako Foreign key hodnoty, které neexistují ve sloupci v jiné tabulce na kterou Foreign key odkazuje.

Vytvoření Foreign Key

Foreign key vytvoříme tak, že při vytváření tabulky přidáme za sloupce text 'FOREIGN KEY', za něj do závorky jaký sloupec chceme použít jako Foreign key, text 'REFERENCES', jméno tabulky na kterou chceme Foreign key napojit a za něj do závorky jméno sloupce z této tabulky.

# v této tabulce nepůjde ve sloupci customer_id nastavit hodnotu, která neexistuje ve sloupci id v tabulce customers
CREATE TABLE orders
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    amount DECIMAL(8,2),
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id) # vytvoření Foreign Key
);

Smazání položek při smazání položky na kterou položky odkazují

Foreign key nám zamezí odstranit položky, na které se v tabulce používající Foreign key odkazuje. Pokud bychom položku chtěli odstranit, tak nejdříve musíme odstranit položku v tabulce s Foreign key, která na položku odkazuje. Pokud to ale tímto způsobem dělat nechceme, tak si můžeme při vytváření Foreign key nastavit, že pri smazání položky na kterou Foreign key odkazuje se položka s Foreign key také smaže. Tuto vlastnost nastavíme připsáním textu 'ON DELETE CASCADE' za vytvoření Foreign key jak ukazuje následující ukázka.

CREATE TABLE orders
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    amount DECIMAL(8,2),
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE CASCADE # při smazání položky v tabulce customers se smaže také položka v této tabulce odkazující na ni
);

Vytvoření více Foreign klíčů

Narozdíl od primáních klíčů si v tabulce můžeme vytvořit i více Foreign klíčů pokud potřebujeme, jednoduše je oddělíme čárkou.

CREATE TABLE likes
(
    user_id INT NOT NULL,
    photo_id INT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (photo_id) REFERENCES photos(id),
    PRIMARY KEY (user_id, photo_id)
);