Tworzenie struktury bazy danych SQL (CREATE TABLE, constraints)

Definicja tabel, ograniczenia, automatyczne skrypty, ćwiczenia — INF.03

Teoria Definicja tabel i ograniczeń w SQL

SQL pozwala tworzyć elastyczne struktury baz danych. Najważniejsze:

  • CREATE TABLE — tworzy nową tabelę
  • PRIMARY KEY — jednoznaczny identyfikator rekordu
  • FOREIGN KEY — powiązanie tabel (relacja)
  • UNIQUE — wymusza unikalność wartości (np. email)
  • NOT NULL — pole obowiązkowe
  • DEFAULT — wartość domyślna, jeśli nie podano w INSERT
  • CHECK — ogranicza zakres wartości (np. wiek >= 18)

Tworząc tabele z dobrze przemyślanymi constraints, zapewniasz spójność i bezpieczeństwo danych.

Ćwiczenie 1 Tworzenie tabeli z ograniczeniami

Stwórz tabelę klienci z następującymi polami i ograniczeniami:
  • id INT jako klucz główny z autoinkrementacją.
  • imie VARCHAR(30) obowiązkowe (NOT NULL).
  • email VARCHAR(100) unikalny (UNIQUE).
  • wiek INT z ograniczeniem, że wiek ≥ 18.
CREATE TABLE klienci (
  id INT PRIMARY KEY AUTO_INCREMENT,
  imie VARCHAR(30) NOT NULL,
  email VARCHAR(100) UNIQUE,
  wiek INT CHECK (wiek >= 18)
);

Ćwiczenie 2 Powiązanie tabel — klucz obcy

Stwórz tabelę zamowienia, aby każdy rekord wskazywał klienta.
  • Dodaj kolumnę klient_id INT jako klucz obcy.
  • Ustaw produkt VARCHAR(50) jako pole wymagane.
  • Ustaw domyślną wartość ilosc = 1.
CREATE TABLE zamowienia (
  id INT PRIMARY KEY AUTO_INCREMENT,
  klient_id INT,
  produkt VARCHAR(50) NOT NULL,
  ilosc INT DEFAULT 1,
  FOREIGN KEY (klient_id) REFERENCES klienci(id)
);

Ćwiczenie 3 NOT NULL i wartości domyślne

Utwórz tabelę logowania z datą i statusem domyślnym „OK”.
  • user_id INT musi być podany (NOT NULL).
  • Data logowania domyślnie ustawiana na bieżącą datę.
  • Status domyślnie „OK”, ale można go zmienić.
CREATE TABLE logowania (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT NOT NULL,
  data DATE DEFAULT (CURRENT_DATE),
  status VARCHAR(10) DEFAULT 'OK'
);

Ćwiczenie 4 CHECK i skrypt automatyzujący

Napisz skrypt tworzący tabelę produkty tylko z pozytywną ceną oraz wymuszający unikalność kodu produktu.
  • Użyj CHECK (cena > 0) dla pola cena.
  • Wymuś unikalność kodu produktu (UNIQUE).
  • Dodaj na początku DROP TABLE IF EXISTS, aby skrypt dało się uruchomić wielokrotnie.
DROP TABLE IF EXISTS produkty;

CREATE TABLE produkty (
  id INT PRIMARY KEY AUTO_INCREMENT,
  kod VARCHAR(30) UNIQUE NOT NULL,
  nazwa VARCHAR(100),
  cena DECIMAL(10,2) CHECK (cena > 0)
);

Ćwiczenie 5 Kompleksowy skrypt bazy z relacjami

Zaprogamuj pełny skrypt tworzący trzy powiązane tabele: klasy, uczniowie, oceny.
  • W tabeli klasy nazwa klasy musi być unikalna.
  • W tabeli uczniowie umieść klucz obcy do klasy.id.
  • W tabeli oceny ogranicz oceny do zakresu 2–5.
CREATE TABLE klasy (
  id INT PRIMARY KEY AUTO_INCREMENT,
  nazwa VARCHAR(20) UNIQUE NOT NULL
);

CREATE TABLE uczniowie (
  id INT PRIMARY KEY AUTO_INCREMENT,
  imie VARCHAR(30) NOT NULL,
  nazwisko VARCHAR(50) NOT NULL,
  klasa_id INT,
  FOREIGN KEY (klasa_id) REFERENCES klasy(id)
);

CREATE TABLE oceny (
  id INT PRIMARY KEY AUTO_INCREMENT,
  uczen_id INT,
  przedmiot VARCHAR(30),
  ocena INT CHECK (ocena BETWEEN 2 AND 5),
  FOREIGN KEY (uczen_id) REFERENCES uczniowie(id)
);

Zadanie INF.03 Projekt bazy „Wypożyczalnia”

Opis: Zaprojektuj strukturę bazy dla prostej wypożyczalni filmów:
  • klienci — dane klientów, e‑mail nie może się powtarzać.
  • filmy — lista filmów z ceną wypożyczenia > 0.
  • wypozyczenia — tabela łącząca klientów z filmami.
  1. Stwórz trzy tabele z odpowiednimi kluczami głównymi.
  2. Powiąż tabele wypozyczenia z klienci i filmy przez klucz obcy.
  3. Wymuś unikalność e‑maila klienta.
  4. Wymuś, aby cena wypożyczenia filmu była dodatnia.
CREATE TABLE klienci (
  id INT PRIMARY KEY AUTO_INCREMENT,
  imie VARCHAR(30) NOT NULL,
  nazwisko VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL
);

CREATE TABLE filmy (
  id INT PRIMARY KEY AUTO_INCREMENT,
  tytul VARCHAR(100) NOT NULL,
  cena_wypozyczenia DECIMAL(6,2) CHECK (cena_wypozyczenia > 0)
);

CREATE TABLE wypozyczenia (
  id INT PRIMARY KEY AUTO_INCREMENT,
  klient_id INT NOT NULL,
  film_id INT NOT NULL,
  data_wyp DATE DEFAULT (CURRENT_DATE),
  FOREIGN KEY (klient_id) REFERENCES klienci(id),
  FOREIGN KEY (film_id)   REFERENCES filmy(id)
);

Quiz Sprawdź wiedzę!

  1. Jaka jest rola klucza PRIMARY KEY?
  2. Jak wymusić unikalność wartości w kolumnie?
  3. Do czego służy ograniczenie CHECK?
  4. Jak powiązać ze sobą tabele w relacyjnej bazie danych?
  5. Jak ustawić wartość domyślną dla pola w tabeli?
  • Zapewnia jednoznaczną identyfikację każdego rekordu w tabeli.
  • Poprzez użycie UNIQUE lub ustawienie kolumny jako PRIMARY KEY.
  • Ogranicza możliwe wartości w kolumnie, np. tylko liczby dodatnie lub określony zakres.
  • Za pomocą FOREIGN KEY, który odwołuje się do klucza głównego innej tabeli.
  • Przy pomocy klauzuli DEFAULT w definicji kolumny.

Checklista Sprawdź umiejętności

  • Tworzę tabele i nadaję ograniczenia: PRIMARY KEY, UNIQUE, NOT NULL, CHECK, DEFAULT, FOREIGN KEY.
  • Projektuję relacje między tabelami (1‑w‑wiele) z użyciem kluczy obcych.
  • Przygotowuję skrypty DROP + CREATE do wielokrotnego odtwarzania struktury.
  • Potrafię zamienić opis słowny systemu na strukturę bazy SQL.
Materiały: INF.03 — Tworzenie struktury bazy SQL · Autor: Tomasz Puchała © 2025