[SQL] Tabele - tworzenie i zmienianie

opublikował: _Wojtek, 2014-03-07

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:

  1. Id – typu number, które jest kluczem głównym (czyli jest  unikalne i wymagane)
  2. Imię – typu varchar2 o maksymalnej długości 20, wymagane.
  3. Nazwisko – typu varchar2 o maksymalnej długości 20, wymagane.
  4. Data_Urodzenia – typu date,  wymagane.
  5. Pesel – typu number, wymagane, unikalne.
  6. Telefon – typu number, opcjonalne (nie trzeba podawać wartości)
  7. Urlop – typu varchar2 o maksymalnej długości 40, domyślnej wartości „nie”, wymagany.
  8. Dzieci – typu char, o stałej długości 1.

 

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:

  • NOT NULL
  • DEFAULT
  • CHECK
  • FOREIGN KEY
  • PRIMARY KEY
  • UNIQUE

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:

 

  • Stwórz tabelę o nazwie Sportowcy:
    1. Id (klucz główny, number)

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)

 

  • Stwórz tabelę o nazwie Sporty:
  1. Id (klucz główny, number)
  2. Nazwa (not null, varchar2(40))
     
  • Połącz tabele tak, aby w tabeli Sportowcy wyświetlał się numer identyfikacyjny sportu, który aktualnie jest uprawiany przez sportowca. Przyjmijmy, że jeden sportowiec uprawia jedną dyscyplinę.
     
  • Zmień nazwę tabeli Sportowcy na Olimpijczycy.

     
  • Zmień kolumnę Osiągnięcia tak, aby była wymagana.
     
  • Zmień kolumnę Id w tabeli Sportowcy, aby nie było wymagane. Dlaczego nie można tego zrobić?

 

                                                                                                                                                         Wojciech Besler

 


Zarejestruj się albo zaloguj aby dodać komentarz

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

KONSTRUKTOR

Schrag Polska Sp.z o.o.
Konstantynów Łódzki, łódzkie

KOMISJONER

LIMNUSWORK Sp. z o.o.
Niemcy, -- dowolny Region --

wszystkie oferty

 

 

 

 
 
 

Kalendarz wydarzeń

WSZYSTKIE WYDARZENIA