Definicja tabeli

Do zdefiniowania nowej tabeli używamy instrukcji CREATE TABLE. Niezbędnymi parametrami są: nazwa tabeli, nazwy i typy kolumn.

	CREATE TABLE nazwa_tabeli(pole1 typ,pole2 typ,..);

W celu zdefiniowania tabeli "Kontakt" z polami "Imie","Nazwisko","Nr_tel" należy napisać instrukcję SQL:

	CREATE TABLE Kontakt(Imie varchar(20),Nazwisko varchar(30),Nr_tel varchar(12));
Wartości domyślne

Język SQL umożliwia określenie domyślnych wartości poszczególnych pól tabeli w sytuacji, gdy nie podamy dla nich wartości podczas wprowadzania danych. Definicję wartości domyślnej dla pola umożliwia klauzula DEFAULT.

	CREATE TABLE Produkt(id int4,Nazwa varchar(30),typ varchar(1) DEFAULT 'A');

Powyższe polecenie SQL zdefiniowało tabelę Produkt z polami: "id","Nazwa" oraz "typ" i ustawiło wartość domyślną pola typ na "A". Za pomocą klauzuli DEFAULT możemy również nadawać identyfikatory poszczególnych rekordów np.:

CREATE TABLE Produkt(id int4 DEFAULT nextval('produkt_licznik'),
     Nazwa varchar(30),
     typ varchar(1) DEFAULT 'A');

Składnia wyrażenia "nextval(..)" opisana jest poniżej w podpunkcie "Liczniki". Powyższy przykład nadaje każdemu wprowadzanemu rekordowi wartość pola "id" zwiększoną o jeden.

Warunki integralności

Definiując tabele możemy określić, czy poszczególne pola mogą przyjmować wartości nieokreślone (NULL). Domyślnie system umożliwia wprowadzanie wartości nieokreślonych. Możemy wymusić wprowadzenie wartości do określonych pól za pomocą klauzuli NOT NULL. Przykładowa składnia polecenia CREATE TABLE z wykorzystaniem klauzuli NOT NULL wygląda następująco:

CREATE TABLE Pracownik(Imie varchar(20) NOT NULL,
     Nazwisko varchar(30) NOT NULL,
     Nr_tel varchar(12));

Relacyjne bazy danych umożliwiają dokonanie sprawdzenia poprawności wprowadzanych danych. Za pomocą klauzuli CHECK możemy na etapie projektowania tabeli określić jakie wartości mogą przyjmować poszczególne pola. Przykładowo projektując tabelę pracownik możemy określić, że pole "placa" musi przyjmować wartości większe od zera.

CREATE TABLE Pracownik(Imie varchar(20) NOT NULL,
     Nazwisko varchar(30) NOT NULL,
     Nr_tel varchar(12),
     placa float4 CHECK (placa>0));

Sprawdzenie warunków integralności nie musi dotyczyć wyłącznie danego pola. Możliwe jest porównanie różnych pól. Przykładowo możemy sprawdzić, czy płaca jest większa od pobranych zaliczek.

 CREATE TABLE Pracownik (
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL,
	Nr_tel varchar(12),
	placa float4 CHECK (placa>0)
	zaliczki float4 CHECK (zaliczki<800),
	CHECK (placa>zaliczki));

Wymuszenie wprowadzania niepowtarzalnych danych umożliwia kaluzula UNIQUE. Dla tabeli pracownik polem, którego wartość nie może się powtórzyć jest "PESEL". Może być dwóch Adamów Kowalskich, ale nie mogą oni posiadać tego samego numeru PESEL. Poniższa definicja tabeli przedstawia deklarację unikalnych wartości pola:

	CREATE TABLE Pracownik (
	PESEL varchar(13) UNIQUE,
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL);

Klauzuli UNIQUE możemy użyć również na końcu definicji tabeli określając które pola powinny być unikalne.:

	CREATE TABLE Pracownik (
	PESEL varchar(13),
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL,
	id_grupy int4,
	UNIQUE (PESEL,id_grupy));

Klucz główny

Większość systemów baz danych nie wymaga definicji kluczy tabeli. Jednak dobrym zwyczajem jest korzystanie z kluczy głównych i obcych, co zapobiega ewentualnym niespójnościom bazy, jak również przyspiesza wykonywanie operacji na niej. Poniżej znajduje się definicja tabeli pracownik z kluczem głównym "ID"

	CREATE TABLE Pracownik (
	ID int8 PRIMARY KEY,
	PESEL varchar(13),
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL,
	id_grupy int4,
	UNIQUE (PESEL,id_grupy));

Klauzula PRIMARY KEY spowoduje, że system sam ustawi na pole ograniczenia: UNIQUE i NOT NULL. Każda tabela może posiadać tylko jeden klucz główny, natomiast klucz główny może być złożony z więcej niż jednej kolumny. W takim przypadku klauzula PRIMARY KEY musi znajdować się na końcu definicji tabeli:

	CREATE TABLE Pracownik (
	ID int8,
	PESEL varchar(13),
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL,
	id_grupy int4,
	UNIQUE (PESEL,id_grupy),
	PRIMARY KEY(ID,PESEL));

Klucz obcy

Klucz obcy to powiązanie tabeli z inną tabelą. Definiując pole jako klucz obcy ograniczamy jego listę dopuszczalnych wartości do wartości przechowywanych w podanym polu innej tabeli. Klucz obcy musi wskazywać na istniejące pole tego samego typu w innej tabeli. Dodatkowo pole te tabeli musi mieć nałożone przynajmniej jedno z ograniczeń: PRIMARY KEY lub UNIQUE. Przykładowa definicja tabeli pracownik, z polem "stanowisko",jako kluczem obcym powinna wyglądać następująco:

	CREATE TABLE Stanowiska(
	ID int4,
	stanowisko varchar(13),
	PRIMARY KEY(ID));

 

	CREATE TABLE Pracownik (
	ID int8,
	PESEL varchar(13),
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL,
	id_grupy int4,
	id_stanowiska int4 REFERENCES Stanowiska(ID),
	UNIQUE (PESEL,id_grupy),
	PRIMARY KEY(ID,PESEL));

Należy zwrócić uwagę na fakt, że pola w poszczególnych tabelach nie muszą mieć identycznych nazw, ważne żeby były tego samego typu. Ponieważ jako klucz obcy wykorzystany został klucz główny tabeli "Stanowiska" zapis klucza obcego można uprościć podając tylko nazwę tabeli, do której się ten klucz odnosi.

	CREATE TABLE Pracownik (
	ID int8,
	PESEL varchar(13),
	Imie varchar(20) NOT NULL,
	Nazwisko varchar(30) NOT NULL,
	id_grupy int4,
	id_stanowiska int4 REFERENCES Stanowiska,
	UNIQUE (PESEL,id_grupy),
	PRIMARY KEY(ID,PESEL));

W przeciwieństwie do Klucza głównego, tabela może posiadać kilka kluczy obcych. Klucze obce wymuszają integralność bazy danych. Wiąże się to z pewnymi ograniczeniami edycyjnymi danych. Nie można usunąć rekordu do którego odwołuje się klucz obcy. W sytuacji, gdy usuwamy rekord z kluczem obcym powinniśmy usunąć rekordy z tabeli podrzędnej z danym kluczem obcym. Do ustalenia sposobu zachowania się systemu w przypadku próby usunięcia danych z tabeli nadrzędnej służą dwie klauzule:

ON DELETE RESTRICT

ON DELETE CASCADE

Klauzula "ON DELETE RESTRICT" zapobiega usunięciu rekordu do którego odwołuje się klucz obcy, natomiast klauzula "ON DELETE CASCADE" powoduje usunięcie odwołujących się do danego rekordu kluczy obcych. Poniższy przykład przedstawia sposób definiowania poszczególnych akcji systemu baz danych.

CREATE TABLE produkt (
id integer PRIMARY KEY,
nazwa text,
cena numeric
);

CREATE TABLE klient (
id integer PRIMARY KEY,
adres text);

CREATE TABLE zakupy (
id integer,
id_produktu integer REFERENCES produkt ON DELETE RESTRICT,
id_klienta integer REFERENCES klient ON DELETE CASCADE,
cena numeric,
PRIMARY KEY (id));

Powyższa definicja umożliwia skasowanie rekordu z tabeli "klient" włącznie z odpowiadającymi mu rekordami w tabeli zakupy, natomiast uniemożliwia usunięcie rekordu z tabeli produkt. Domyślnie ustawiona jest klauzula "ON DELETE RESTRICT".

Definicja tabeli przez zapytanie

W języku SQL możliwe jest zdefiniowanie nowej tabeli poprzez wykonanie zapytania do bazy danych. Składnia takiej definicji wygląda następująco:

	CREATE TABLE nazwa_tabeli
	[nazwa kolumny (...)...]
	AS SELECT zapytanie;