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