UNIQUE a CHECK

Primární klíč zajistí, že žádné dva řádky nemají stejné ID. Často ale musí být jedinečný i jiný sloupec: dva zákazníci nemohou mít stejný e-mail, jinak by obchod nevěděl, čí je to účet. To říká UNIQUE (jedinečný) za typem sloupce. Turnaje obchodu by si mohly vést hráče takhle:

CREATE TABLE hraci (
    id INTEGER PRIMARY KEY,
    prezdivka TEXT NOT NULL UNIQUE,
    vek INTEGER NOT NULL CHECK (vek >= 13)
) STRICT;

Druhého hráče s přezdívkou, která už je obsazená, databáze odmítne. Nevloží se ani jeden z obou řádků: příkaz, který skončí chybou, nic nezmění.

INSERT INTO hraci (prezdivka, vek)
VALUES ('NightOwl', 15),
       ('NightOwl', 22);
Error on line 1: UNIQUE constraint failed: hraci.prezdivka

UNIQUE dovolí NULL, a to i mnohokrát: NULL znamená žádnou hodnotu a jedna chybějící hodnota se nerovná jiné. Když musí mít sloupec hodnotu vždycky, přidejte NOT NULL jako výše. E-mail zákazníků obchodu je také TEXT NOT NULL UNIQUE.

CHECK (kontrola), za kterým následuje podmínka v závorkách, nastaví pravidlo, které musí splnit každý řádek. Podmínka se píše stejně jako ve WHERE a turnaje výše jsou pro hráče od 13 let:

INSERT INTO hraci (prezdivka, vek)
VALUES ('Prcek', 11);
Error on line 1: CHECK constraint failed: vek >= 13

Tabulky obchodu CHECK také používají: hvězdičky recenze musí být BETWEEN 1 AND 5, počet kusů > 0 a stav objednávky IN ('zaplaceno', 'vraceno'). CHECK, který porovnává dva sloupce, nebo UNIQUE pro dva sloupce dohromady se píše za poslední sloupec, na samostatný řádek:

CREATE TABLE turnaje (
    id INTEGER PRIMARY KEY,
    nazev TEXT NOT NULL,
    zacatek TEXT NOT NULL,
    konec TEXT NOT NULL,
    CHECK (konec >= zacatek),
    UNIQUE (nazev, zacatek)
) STRICT;

UNIQUE (nazev, zacatek) dovolí dva turnaje se stejným názvem i dva, které začínají ve stejný den, ale ne dva se stejným názvem ve stejný den.

Typická chyba: zapomenout, že CHECK pustí NULL. Když je ve vek NULL, podmínka vek >= 13 není pravdivá ani nepravdivá a CHECK řádek odmítne, jen když je jeho podmínka nepravdivá. Proto sloupec s CHECK obvykle potřebuje i NOT NULL.

Pokyny

Obchod chce rozdávat slevové kupony. Vytvořte tabulku kupony (STRICT) s těmito sloupci v tomto pořadí:

  • id – celočíselný primární klíč,
  • kod – text, vždycky vyplněný, a žádné dva kupony nesmějí mít stejný kód,
  • sleva – sleva v procentech, celé číslo, vždycky vyplněné, od 5 do 50,
  • plati_do – poslední den, kdy jde kupon použít, vždycky vyplněný.

Vložte tyto čtyři kupony (kód, sleva, poslední den):

  • 'VITEJTE10', 10, '2026-12-31'
  • 'ZIMA25', 25, '2026-02-28'
  • 'BLESK50', 50, '2026-01-15'
  • 'JARO10', 10, '2026-05-31'

Pak ukažte celou tabulku seřazenou podle slevy od největší a kupony se stejnou slevou podle kódu:

idkodslevaplati_do
3BLESK50502026-01-15
2ZIMA25252026-02-28
4JARO10102026-05-31
1VITEJTE10102026-12-31

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

5/10