Więzy integralności w SQL

Wyobraź sobie, że baza danych to ogromna biblioteka.
Każda książka ma swój numer, każda karta czytelnika swoje dane, a każda wypożyczona książka musi być przypisana do konkretnego czytelnika.

Żeby w tej bibliotece panował porządek, ktoś musi pilnować, by:

  • nie było dwóch książek o tym samym numerze,
  • nie dało się wypożyczyć książki, której nie ma,
  • nie dodano czytelnika bez nazwiska,
  • i nie można było usunąć klienta, który ma jeszcze wypożyczone książki.

Tym kimś w SQL są właśnie więzy integralności (ang. constraints).


1. Czym są więzy integralności?

Więzy integralności (constraints) to zasady, które określają, co wolno, a czego nie wolno wprowadzać do bazy danych.
Pomagają utrzymać spójność (integralność) danych, czyli pewność, że wszystko do siebie pasuje.

Przykłady:

  • nie można mieć dwóch klientów o tym samym identyfikatorze,
  • nie można mieć zamówienia bez klienta,
  • cena produktu nie może być ujemna.

2. Rodzaje więzów integralności

Nazwa więzuDziałanie
PRIMARY KEYUnikalny identyfikator rekordu
FOREIGN KEYPowiązanie między tabelami
UNIQUEWartość w kolumnie nie może się powtarzać
NOT NULLKolumna nie może być pusta
CHECKSprawdza warunek logiczny (np. cena > 0)
DEFAULTUstawia wartość domyślną, jeśli nie podano innej

3. Przykłady z bazy sklep_muzyczny

a) PRIMARY KEY – klucz główny

Każdy rekord musi mieć unikalny identyfikator.
Najczęściej jest to kolumna id lub id_tabeli.

CREATE TABLE Klienci (
    id_klienta INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50),
    nazwisko VARCHAR(50),
    email VARCHAR(100)
);

PRIMARY KEY sprawia, że:

  • każda wartość id_klienta jest unikalna,
  • nie może być pusta,
  • baza sama nie pozwoli na duplikaty.

b) FOREIGN KEY – klucz obcy

Używany do tworzenia relacji między tabelami (np. zamówienie musi należeć do istniejącego klienta).

CREATE TABLE Zamowienia (
    id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
    id_klienta INT,
    id_produktu INT,
    ilosc INT,
    FOREIGN KEY (id_klienta) REFERENCES Klienci(id_klienta),
    FOREIGN KEY (id_produktu) REFERENCES Produkty(id_produktu)
);

FOREIGN KEY pilnuje, żeby nie można było dodać zamówienia z nieistniejącym id_klienta lub id_produktu.


c) UNIQUE – brak powtórzeń

Zapewnia, że dana kolumna nie może mieć duplikatów.

CREATE TABLE Klienci (
    id_klienta INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(100) UNIQUE
);

Nie można wstawić dwóch klientów z tym samym adresem e-mail.


d) NOT NULL – brak pustych wartości

Wymaga, żeby dana kolumna zawsze miała wartość.

CREATE TABLE Produkty (
    id_produktu INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100) NOT NULL,
    cena DECIMAL(10,2) NOT NULL
);

Produkt musi mieć nazwę i cenę – nie można dodać pustych wartości.


e) CHECK – sprawdzanie warunków

Pozwala ustawić reguły logiczne, które muszą być spełnione.

CREATE TABLE Produkty (
    id_produktu INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100) NOT NULL,
    cena DECIMAL(10,2) CHECK (cena > 0),
    kategoria VARCHAR(50)
);

Nie można wprowadzić produktu o cenie 0 lub mniejszej.


f) DEFAULT – wartość domyślna

Jeśli użytkownik nie poda wartości, baza wstawi domyślną.

CREATE TABLE Zamowienia (
    id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
    data_zamowienia DATE DEFAULT (CURRENT_DATE)
);

Jeśli przy dodawaniu zamówienia nie podasz daty, zostanie automatycznie wpisana dzisiejsza data.


4. Modyfikowanie więzów w istniejących tabelach

Dodanie nowego więzu

ALTER TABLE Produkty
ADD CONSTRAINT cena_dodatnia CHECK (cena > 0);

Usunięcie więzu

ALTER TABLE Produkty
DROP CONSTRAINT cena_dodatnia;

5. Co daje stosowanie więzów?

✅ Chroni przed błędami w danych
✅ Zapewnia logiczne powiązania między tabelami
✅ Ułatwia utrzymanie porządku i spójności w bazie
✅ Ogranicza błędy użytkowników – baza „odrzuca” niepoprawne dane


6. Przykład pełnej tabeli z więzami

CREATE TABLE Klienci (
    id_klienta INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50) NOT NULL,
    nazwisko VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    miasto VARCHAR(100) DEFAULT 'Działdowo'
);

CREATE TABLE Produkty (
    id_produktu INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100) NOT NULL,
    cena DECIMAL(10,2) CHECK (cena > 0),
    kategoria VARCHAR(50) NOT NULL
);

CREATE TABLE Zamowienia (
    id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
    id_klienta INT NOT NULL,
    id_produktu INT NOT NULL,
    ilosc INT CHECK (ilosc > 0),
    data_zamowienia DATE DEFAULT (CURRENT_DATE),
    FOREIGN KEY (id_klienta) REFERENCES Klienci(id_klienta),
    FOREIGN KEY (id_produktu) REFERENCES Produkty(id_produktu)
);

7. Zadania praktyczne

Zadanie 1 – tworzenie tabeli z więzami

Utwórz tabelę Pracownicy z kolumnami:

  • id_pracownika – klucz główny,
  • imie, nazwisko – wymagane (NOT NULL),
  • email – unikalny,
  • pensja – większa niż 0 (CHECK),
  • stanowisko – z wartością domyślną „sprzedawca”.

Zadanie 2 – klucze obce

Utwórz tabele:

  • Dzialy (id_dzialu, nazwa)
  • Pracownicy (id_pracownika, imie, id_dzialu)

Połącz je kluczem obcym tak, żeby każdy pracownik należał do istniejącego działu.


Zadanie 3 – testowanie więzów

  1. Spróbuj dodać pracownika bez imienia – co się stanie?
  2. Spróbuj dodać dwóch pracowników z tym samym e-mailem.
  3. Spróbuj dodać produkt z ceną 0.
  4. Spróbuj dodać zamówienie dla nieistniejącego klienta.

Zadanie 4 – modyfikacja tabel

  1. Do tabeli Produkty dodaj więz CHECK (ilosc > 0).
  2. Do tabeli Klienci dodaj kolumnę wiek z warunkiem CHECK (wiek >= 18).

8. Podsumowanie

WięzDziałaniePrzykład
PRIMARY KEYunikalny identyfikatorid_klienta
FOREIGN KEYpołączenie tabelFOREIGN KEY (id_klienta)
UNIQUEbrak duplikatówemail UNIQUE
NOT NULLbrak pustych wartościimie NOT NULL
CHECKwarunek logicznycena > 0
DEFAULTwartość domyślnaDEFAULT 'Działdowo'

Więzy integralności to wewnętrzne zasady bezpieczeństwa bazy danych.
Dzięki nim baza „pilnuje się sama” – nie pozwala wprowadzić błędnych lub sprzecznych informacji.
To ważna część projektowania profesjonalnych baz danych i często pojawia się na egzaminach INF.03 / INF.04.