CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (

{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]

| table_constraint

| LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] } [, ... ]

)

[ INHERITS ( parent_table [, ... ] ) ]

[ WITH OIDS | WITHOUT OIDS ]

[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]

where column_constraint is:

[ CONSTRAINT constraint_name ]

{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |

CHECK (expression) |

REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]

[ ON DELETE action ] [ ON UPDATE action ] }

[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

and table_constraint is:

[ CONSTRAINT constraint_name ]

{ UNIQUE ( column_name [, ... ] ) |

PRIMARY KEY ( column_name [, ... ] ) |

CHECK ( expression ) |

FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]

[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }

[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

GLOBAL | LOCAL - PostgreSQL nie ma podziału na moduły, brak efektu tych poleceń

TEMPORARY | TEMP - na czas obowiązywania sesji

LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] domyślnie jest EXCLUDING DEFAULTS

INHERITS ( parent_table [, ... ] ) - nowa tabela powstaje z innej lub innych tabel

PRZYKŁAD

create table lek2 () inherits (lekarze);

WITH OIDS
WITHOUT OIDS

OIDs (object identifiers) - identyfikatory obiektów . Wartość domyślna: WITH OIDS.

Likwidacja OID oszczędza miejsce na identyfikatory i licznik OIDS.

REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)
FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)

match types:

MATCH FULL,

MATCH PARTIAL,

MATCH SIMPLE, domyślnie

MATCH FULL - nie pozawala, aby wartość w żadnej kolumnie złożonego klucza obcego była NULL chyba, że wszystkie są NULL

MATCH SIMPLE - część kolumn klucza obcego może mieć wartości puste

MATCH PARTIAL jeszcze nie zaimplementowane w PostgreSQL

ON DELETE, lub

ON UPDATE

NO ACTION - domyślna akcja, wywołanie błędu. Jeżeli akcje podejmowane po aktualizacji lub usunięciu wpisu w tabeli klucza obcego mogą być odłożone w czasie i zostaną odłożone w czasie do momentu zakończenia bloku transakcji, to wywołanie błędu zostanie wstrzymane do tego momentu.

RESTRICT - jak NO ACTION (czyli wywołanie błędu) z wyjątkiem tego, że ta akcja nie będzie odłożona i błąd zostanie zgłoszony bez oczekiwania na zamknięcie transakcji

CASCADE - kaskadowe aktualizowanie czy usuwanie

SET NULL - w kolumnach odwołania wstawienie wartości NULL

SET DEFAULT - w kolumnach odwołania wstawienie wartości domyslnych

Przy częstych aktualizacjach klucza głównego warto ustawić index na kolumnie klucza obcego, w celu zwiększenia wydajności.

DEFERRABLE
NOT DEFERRABLE - domyślne

czy sprawdzanie klucza obcego jest odłożone do momentu zakończenia transakcji aktualizacji lub usuwania

INITIALLY IMMEDIATE, - klucz obcy sprawdzany po każdej kwerendzie

INITIALLY DEFERRED- klucz obcy sprawdzany po bloku kwerend zamkniętych w jawnej transakcji

ON COMMIT - co zrobić z tabelą tymczasową po zakończeniu transakcji

PRESERVE ROWS - domyslna kacja, nic nie robić

DELETE ROWS - automatyczny TRUNCATE

DROP - usuniecie tabeli (normalnie tabela jest usuwana dopiero po zamknięciu sesji

CREATE TABLE lekarze(

id serial not null,

name VARCHAR( 40 ) not NULL ,

salary FLOAT(4) DEFAULT 100,

CONSTRAINT sal_check CHECK(SALARY>50),

CONSTRAINT id_pk PRIMARY KEY (id));

CREATE TABLE distributors (

did integer PRIMARY KEY DEFAULT nextval('serial'),

name varchar(40) NOT NULL CHECK (name <> '')

);

CREATE TABLE films (

code char(5),

title varchar(40),

did integer,

date_prod date,

kind varchar(10),

len interval hour to minute,

CONSTRAINT production UNIQUE(date_prod)

);

CREATE TABLE distributors (

did integer CHECK (did > 100),

name varchar(40)

);

Define a check table constraint:

CREATE TABLE distributors (

did integer,

name varchar(40)

CONSTRAINT con1 CHECK (did > 100 AND name <> '')

);

CREATE TABLE films (

code char(5),

title varchar(40),

did integer,

date_prod date,

kind varchar(10),

len interval hour to minute,

CONSTRAINT code_title PRIMARY KEY(code, title)

);

SKORO ZŁOŻONY TO JAKO OGRANICZENIE DLA TABELI A NIE KOLUMNY