5. CVIČENÍ


Druhy integrity dat

Entitní :

Entitní integrita spočívá v tom, že žádný atribut který je součástí primárního klíče nesmí být NULL, aby bylo možné každý záznam jednoznačně identifikovat. Klíč označíme klíčovým slovem PRIMARY KEY.

CREATE TABLE osoby (
  os_cislo   NUMBER(5)    PRIMARY KEY,
  jmeno      VARCHAR2(30) NOT NULL,
  prijmeni   VARCHAR2(30) NOT NULL,
  dat_naroz  DATE,
  pohlavi    CHAR(1)      NOT NULL,
  telefon    VARCHAR2(50)
);

Klíč může být i složený, tj. může jej tvořit několik atributů (sloupců) :

CREATE TABLE predmety (
  zkratka   VARCHAR2(5),
  katedra   VARCHAR2(3),
  nazev     VARCHAR2(30) NOT NULL,
  kredity   NUMBER(2)    NOT NULL,
  CONSTRAINT pk_predmety PRIMARY KEY (zkratka, katedra)
);

Ostatní jedinečné položky, které nejsou primárním klíčem lze označit klíčových slovem UNIQUE :

CREATE TABLE osoby (
  os_cislo   NUMBER(5)    PRIMARY KEY,
  rod_cis    VARCHAR2(30) NOT NULL UNIQUE,
  jmeno      VARCHAR2(30) NOT NULL,
  prijmeni   VARCHAR2(30) NOT NULL,
  dat_naroz  DATE,
  pohlavi    CHAR(1)      NOT NULL,
  telefon    VARCHAR2(50)
);

Doménová :

Doménová integrita zajišťuje, že hodnota atributu leží vždy v korektním oboru hodnot. Obor hodnot atributu lze kontrolovat pomocí klauzule CHECK(podmínka).

CREATE TABLE osoby (
  os_cislo   NUMBER(5)    PRIMARY KEY,
  rod_cis    VARCHAR2(30) NOT NULL UNIQUE,
  jmeno      VARCHAR2(30) NOT NULL,
  prijmeni   VARCHAR2(30) NOT NULL,
  dat_naroz  DATE,
  pohlavi    CHAR(1)      NOT NULL,
  telefon    VARCHAR2(50),
  plat       NUMBER(5)    CHECK ( plat > 5000 AND plat < 20000 )
);

Referenční :

Obsahuje-li tabulka cizí klíč, musí v existovat v "domovské" tabulce záznam se stejnou hodnotou primárního klíče. V opačném případě musí všechny atributy tvořící cizí klíč mít hodnotu NULL.

Pozn.: definici integritních omezení není nutné zapisovat přímo u definice sloupce, ale je možné ji zapsat až na konec jako klauzuli CONSTRAINT. Jednotlivá integritní omezení je možné i pojmenovat.

"Rodičovská" tabulka :

CREATE TABLE pracoviste (
  cislo_prac NUMBER(5)    NOT NULL,
  nazev      VARCHAR2(30) NOT NULL UNIQUE,
  CONSTRAINT pk_prac PRIMARY KEY ( cislo_prac )
);

Následující příklad ukazuje restriktivní způsob zajištění referenční integrity. Nelze zrušit pracoviště na němž jsou evidováni zaměstanci.

Tabulka s cizím klíčem :

CREATE TABLE osoby (
  os_cislo   NUMBER(5)    NOT NULL,
  rod_cis    VARCHAR2(30) NOT NULL UNIQUE,
  jmeno      VARCHAR2(30) NOT NULL,
  prijmeni   VARCHAR2(30) NOT NULL,
  dat_naroz  DATE,
  pohlavi    CHAR(1)      NOT NULL,
  telefon    VARCHAR2(50),
  plat       NUMBER(5)    CHECK ( plat > 5000 AND plat < 20000 ),
  cislo_prac NUMBER(5)    NOT NULL,
  CONSTRAINT pk_osoby PRIMARY KEY ( os_cislo ),
  CONSTRAINT fk_prac  FOREIGN KEY ( cislo_prac )
                      REFERENCES pracoviste ( cislo_prac )
                      ON UPDATE NO ACTION
                      ON DELETE NO ACTION
);
Restrikce je docíleno použitím klauzulí zvýrazněných kurzívou. NO ACTION říká, že RDBMS neprovádí žádné akce ohledně zajištění referenční integrity (operace skončí chybovým hlášením). Tento způsob zajištění referenční intergity je implicitní a proto lze tyto klauzule vynechat.

Kaskádní způsob zajištění referenční integrity zajišťuje smazání záznamů všech zaměstnanců rušeného pracoviště.

Tabulka s cizím klíčem :

CREATE TABLE osoby (
  os_cislo   NUMBER(5)    NOT NULL,
  rod_cis    VARCHAR2(30) NOT NULL UNIQUE,
  jmeno      VARCHAR2(30) NOT NULL,
  prijmeni   VARCHAR2(30) NOT NULL,
  dat_naroz  DATE,
  pohlavi    CHAR(1)      NOT NULL,
  telefon    VARCHAR2(50),
  plat       NUMBER(5)    CHECK ( plat > 5000 AND plat < 20000 ),
  cislo_prac NUMBER(5)    NOT NULL,
  CONSTRAINT pk_osoby PRIMARY KEY ( os_cislo ),
  CONSTRAINT fk_prac  FOREIGN KEY ( cislo_prac )
                      REFERENCES pracoviste ( cislo_prac )
                      ON DELETE CASCADE
                      ON UPDATE CASCADE
);
SQL standard kromě CASCADE definuje další možnosti reakce na porušení referenční integrity : Pozn.: RDBMS Oracle podporuje pouze ON DELETE CASCADE (verze 7 a 8) a ON DELETE SET NULL (verze 8).

ALTER TABLE osoby
  ADD CONSTRAINT pk_osoby PRIMARY KEY ( os_cislo );

ALTER TABLE osoby
  ADD CONSTRAINT fk_prac FOREIGN KEY ( cislo_prac )
                         REFERENCES pracoviste ( cislo_prac )
                         ON DELETE CASCADE;

ALTER TABLE osoby
  DROP CONSTRAINT fk_prac;

ALTER TABLE osoby
  DROP CONSTRAINT pk_prac;