Skip to Content

Porządek

Porządek

Ostatnią z rzeczy, których powinniśmy się dowiedzieć o bazach danych, jest zrozumienie w jaki sposób bazy danych pomagają utrzymać porządek w danych.

Popatrzmy na naszą tabelę z osobami.

  1. SELECT * FROM osoby ;
  2. login | imie | nazwisko | mail
  3. -------+------------------+-------------+------------------------
  4. a | Adam | Kowalski | adam.kowalski@mail.pl
  5. b | Basia | Nowak | basia.nowak@mail.pl
  6. f | :) | nasza-klasa | tralalala
  7. d | Ewa | Piątek | Basia na belwederskiej
  8. d | Basia | Piątek | Ewa na belwederskiej
  9. c | cYPRIAN | pan | cyprian.pl
  10. e | A TO mój znajomy | Wtorek |
  11. (7 rows)

Jakie widzimy problemy?

• Są dwie osoby z tym samym loginem
• Niektóre imiona wyraźnie nie są imionami
• Podobnie nazwiska
• Maile nie są poprawnymi adresami
• Nie wszyscy mają wprowadzone maile

Spróbujmy sobie poradzić z tymi problemami.

Na czym polega problem z dwoma osobami o tym samym loginie? Ano na tym, że nie wiadomo jaka jest odpowiedź na pytanie kto ma login d. Chcielibyśmy, żeby ten login jednoznacznie identyfikował osobę. W bazach danych kolumna bądź kolumny jednoznacznie identyfikujące wiersz nazywa się kluczem głównym. Takim kluczem w naszej tabeli jest kolumna login. Dodajmy zatem klucz do tabeli. Robi się to za pomocą:

  1. ALTER TABLE osoby ADD PRIMARY KEY(login);
  2. -- NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "osoby_pkey" for table "osoby"
  3. -- ERROR: could not create unique index "osoby_pkey"
  4. -- DETAIL: Table contains duplicated values.

System napisał, że nie może dodać klucza na kolumnie (login), gdyż tabela zawiera duplikaty. To prawda, usuńmy zatem Ewę Piątek i spróbujmy jeszcze raz.

  1. DELETE FROM osoby WHERE imie = 'Ewa' AND nazwisko = 'Piątek';
  2. -- DELETE 1
  3. ALTER TABLE osoby ADD PRIMARY KEY(login);
  4. -- NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "osoby_pkey" for table "osoby"
  5. -- ALTER TABLE

Tym razem się udało. Sprawdźmy czy klucz zadział.

  1. INSERT INTO osoby VALUES('a');
  2. -- ERROR: duplicate key value violates unique constraint "osoby_pkey"
  3. INSERT INTO osoby VALUES('g');
  4. -- INSERT 0 1

Zadziałał! Nie udało się wprowadzić osoby o loginie 'a', natomiast udało się wprowadzić osobę o loginie 'g'.

No ale mamy inny problem. Mianowicie nie wszystkie pola w bazie są wypełnione. Jeśli pole nie jest wypełnione to ma ono specjalną wartość NULL. Chcielibyśmy, żeby wszystkie pola były wypełnione. Aby kolumna login nigdy nie była pusta, używamy następującej konstrukcji:

  1. ALTER TABLE osoby ALTER COLUMN login SET NOT NULL;
  2. -- ALTER TABLE

Spróbujmy zrobić podobną operację z innymi kolumnami.

  1. ALTER TABLE osoby ALTER COLUMN imie SET NOT NULL;
  2. -- ERROR: column "imie" contains null values

Nie udało się, dlaczego? Bo kolumna imie zawiera puste wartości. Poprawmy to:

  1. UPDATE osoby SET imie = 'Imie' WHERE imie IS NULL;
  2. -- UPDATE 1
  3. ALTER TABLE osoby ALTER COLUMN imie SET NOT NULL;
  4. -- ALTER TABLE

Czy wszystko na pewno zadziałało. Spróbujmy wstawić do tabeli wiersz bez wypełnionego pola imie.

  1. INSERT INTO osoby VALUES('h');
  2. ERROR: NULL value IN COLUMN "imie" violates not-NULL constraint

Zadziałało! Nie można wstawić wiersza bez wypełnionego imienia.

Bazy danych pozwalają na tworzenie dużo ciekawszych warunków poprawności. Przykładowo instrukcja

  1. ALTER TABLE osoby ADD CHECK (imie SIMILAR TO '[A-Z][a-z]*');

sprawdza czy wszystkie imiona mają poprawną postać, czyli składają się z małych liter poprzedzonych wielką.