Od czego zacząć?
Aby w języku SQL tworzyć tabele, pierw musimy wykonać diagram encji, dzięki któremu będziemy wiedzieli co jest kluczem głównym, ile kolumn ma tabela, jakiego jest typu, jakie są ograniczenia, czy są klucze obce itp. Jest to podstawowa czynność jaką robi się przed stworzeniem tabeli – projektowanie. Do tej czynności nie potrzeba żadnych programów, wystarczy kartka papieru i długopis. Musimy pamiętać, że każda nazwa powinna być unikalna, czyli taka sama nazwa tabeli nie może wystąpić dwa razy.
Mam diagram encji, co dalej?
Gdy mamy gotowy projekt, możemy przejść do jego realizowania. W celu stworzenia tabeli w naszej bazie danych stosujemy polecenie:
CREATE TABLE <nazwa_tabeli>(<nazwa _kolumny> <właściwości>);
Dodając nowe kolumny, należy oddzielać je przecinkiem od kolejnych, a po ostatniej kolumnie przecinka nie pisać!
Przykład 1:
CREATE TABLE Pracownicy(
id number constraint Pracownicy_PK primary key,
imię varchar2(20) not null,
nazwisko varchar2(20) not null,
data_urodzenia date not null,
pesel number not null constraint Pracownicy_U unique,
telefon number,
urlop varchar2(40) constraint Pracownicy_d default ‘nie’ not null,
dzieci char(1) constraint Pracownicy_ch(dzieci=’t’ or dzieci=’n’) not null);
Polecenie formułuje tabelę o następujących kolumnach:
Dlaczego w kolumnie id, pesel i dzieci dodaje się constraint?
Tworząc tabelę, system sam generuje nazwy ograniczeń kolumn, np. SYS_C004684. Przy kreowaniu tabeli, definiujemy constraints w celu nadania nazwy konkretnemu ograniczeniu.
Mamy następujące ograniczenia:
W naszym przypadku nie nazwaliśmy ograniczenia dla NOT NULL, gdyż występuje on prawie w każdej kolumnie, przez co dla większej tabeli zajęłoby to więcej czasu.
Nazwy ograniczeń możemy sprawdzić wpisując polecenie:
SELECT *
FROM USER_CONSTRAINTS;
Dlaczego w kolumnie dzieci został użyty CHECK?
W tabeli Pracownicy została utworzona kolumna o tej nazwie w celu przechowywania wartości, która mówi czy dany pracownik posiada dzieci. Kolumna jest typu char(1), czyli zawiera jeden znak. Użyliśmy warunku CHECK, aby zapewnić, że osoba wprowadzająca dane się nie pomyli i wpisze ‘t’ dla osoby posiadającej dzieci lub ‘n’ w przeciwnym wypadku.
Ważna jest tutaj wielkość liter. Jeżeli do bazy będziemy próbowali wprowadzić ‘N’ albo ‘T’ to wyskoczy błąd!
Jak należy tworzyć tabelę, jeżeli na diagramie widać połączenie?
Bardzo często na naszym diagramie encji widnieje łączenie, które ma duży wpływ przy tworzeniu tabeli. Łącząc dwie tabele istnieje możliwość, że do tabeli jest „jedno” dojście (jeden) lub „trzy” dojścia (wiele, tzw. kurza stopka). Przy tworzeniu tabeli bierzemy pod uwagę tabelę do której „wchodzi kurza stopka” – deklaracja takiej tabeli będzie zawierała klucz obcy z innej tabeli.
Przykład 2
Załóżmy, że oprócz tabeli z przykładu 1 na naszym diagramie encji jest jeszcze druga tabela o nazwie Stanowiska, składająca się z numeru identyfikacyjnego (klucz główny) i nazwy (varchar2(20) wymagany, unikalny). Aby ją stworzyć używamy polecenia:
CREATE TABLE Stanowiska(
id number constraint Stanowiska_PK primary key,
nazwa varchar2(20) not null constraint Stanowiska_U unique);
Niech nasze tabele będą w relacji jeden do wielu (każde stanowisko może mieć wielu pracowników, ale pracownik ma tylko jedno stanowisko), zatem kurza stopka będzie „wchodziła” do tabeli Pracownicy. Aby między tabelami było połączenie, należy przy ich tworzeniu dopisać dodatkową linię:
id_Stanowiska NUMBER constraint pracownicy_stanowiska_FK references stanowiska(id) not null
Na początku podaliśmy nazwę kolumny, w której będzie przechowywana wartość typu number. Po references (z ang. odwołanie) musi być nazwa drugiej tabeli, a w nawiasie jego klucz główny. Dodatkowo nadaliśmy nazwę ograniczeniu pracownicy_stanowiska_FK, gdzie FK jest skrótem od foreign key (z ang. klucz obcy).
Pełne polecenie do sformułowania naszej tabeli:
CREATE TABLE Pracownicy(
id number constraint Pracownicy_PK primary key,
imię varchar2(20) not null,
nazwisko varchar2(20) not null,
data_urodzenia date not null,
pesel number not null constraint Pracownicy_U unique,
telefon number,
urlop varchar2(40) constraint Pracownicy_d default ‘nie’ not null,
dzieci char(1) constraint Pracownicy_ch(dzieci=’t’ or dzieci=’n’) not null,
id_Stanowiska NUMBER constraint pracownicy_stanowiska_FK references stanowiska(id) not null);
Takie tworzenie tabel jest bardzo wygodne m.in. ze względu oszczędność czasu – gdybyśmy nie mieli tabeli Stanowiska, tylko pole „stanowiska”, w tabeli Pracownicy musielibyśmy za każdym razem wpisywać pełną nazwę stanowiska danego pracownika, co byłoby naprawdę czasochłonne. Lepszym rozwiązaniem jest stworzenie nowej tabeli ,w której jest przechowywany identyfikator oraz nazwa stanowiska, przez co w tabeli Pracownicy możemy wstawić tylko identyfikator odpowiadający nazwie stanowiska.
W jaki sposób zmienić nazwę tabeli?
Czasami przychodzi potrzeba zmiany nazwy tabeli. W tym celu używamy polecenia:
RENAME <nazwa_starej_tabeli> TO <nazwa_nowej_tabeli>;
Przykład 3:
RENAME Pracownicy TO OSOBY;
Tym sposobem zamienimy nazwę tabeli Pracownicy na Osoby.
Stworzyłem tabelę, ale okazało się, że dałem pole wymagane, czy mogę zamienić na opcjonalne?
Aby zamienić typ kolumny z wymagany na opcjonalny, należy zastosować polecenie:
ALTER TABLE <nazwa_tabeli>
MODIFY (<nazwa_kolumny> NULL);
Dla tabeli z przykładu pierwszego możemy napisać:
ALTER TABLE Pracownicy
MODIFY (nazwisko NULL);
Musimy pamiętać, że istnieją kolumny, których typu nie możemy zmienić, np. klucz główny!
Zadanie sprawdzające:
2. Imię (not null, varchar2(20))
3. Nazwisko (not null, varchar2(20))
4. Osiągnięcia (varchar2(300))
5. Telefon (not null, varchar2(15))
6. Id_Sportu (klucz obcy, number)
Wojciech Besler
faster 09.03.2014 o 17:08
Dobry artykul, ale pojawilo sie klika małych błędów, chyba nie sprawdziłeś wszystkich swoich artykulow zanim je głosiłeś. Popraw je, bo szkoda, by byla, nie zajac miejsca w konkursie. Życzę powodzenia