Tabelite loomine PostgreSQL andmebaasis

Tabeli loomine käib CREATE TABLE lausega 1 2:

CREATE TABLE [IF NOT EXISTS] [andmebaasi_nimi.][nimeruumi_nimi.]tabeli_nimi (
    tulba_nimi andmetüüp [ tulba_kitsendus, [ tulba_kitsendus [, ...] ]
    [, ...]);

Näiteks loome ilmastikunäitude tabeli:

CREATE TABLE ilm (
    temperatuur float,
    niiskus float
)

Tähelepanu tuleks pöörata andmebaasile millega hetkel tööd tehakse. Selleks, et vahetada andmebaasi saab kasutada connect metakäsku:

\connect andmebaasi_nimi

Samas toetavad kõik lausungid täieliku nimega objektidele (tabel, kitsendus, vms) viitamist. Eeldades, et olime vaikimisi andmebaasis (postgres) ning vaikimisi nimeruumis (public), oleks eelmise CREATE TABLE lausungiga samaväärne järgnev lausung:

CREATE TABLE postgres.public.ilm (
    temperatuur float,
    niiskus float
);

Tabeli loomise lausungi üldkujus tulba_kitsendus on defineeritud kui:

{ NOT NULL |
  NULL |
  DEFAULT vaikimisi_väärtus |
  UNIQUE |
  PRIMARY KEY |
  REFERENCES viidatava_tabeli_nimi (viidatava_tabeli_tulp) }

Näiteks:

CREATE TABLE riik (
    id int PRIMARY KEY,
    kood varchar(2) UNIQUE,
    nimi varchar(20)
)

Tulba kitsendused (ing. k. constraint):

  • NOT NULL - Tulba väljal peab INSERT korral alati väärtuse kaasa andma

  • NULL - Tulba välja väärtus on vaikimisi NULL, väärtust pole määratud

  • UNIQUE - Selle tulba väärtused on unikaalsed, sama väärtusega read pole lubatud Tähendab ka seda, et selle tulba jaoks luuakse automaatselt indeks

  • DEFAULT vaikimisi_lause - Kui INSERT korral ei anta väärtust sellele väljale, siis kasutatakse vaikimisi_lause-t, mis võib olla nii konstant, kui ka funktsiooni välja kutsumine

  • PRIMARY KEY - Selle tulba väärtused on käesoleva tabeli primaarseks võtmeks, ekvivalentne UNIQUE NOT NULL kombinatsiooniga. Sellele tulbale lisatakse ka automaatselt indeks

Kitsendusi saab ka hiljem lisada:

ALTER TABLE riik
    ADD CONSTRAINT riik_code UNIQUE (kood);

MySQL-is tuntud AUTOINCREMENT võtmesõna PostgreSQL-is puudub, seda asendab jada (sequence) konseptsioon. Selleks, et identifikaatori tulba väärtuseid automaatselt genereeritakse tuleb selle jaoks jada objekt luua ning see siduda tabeli tulbaga:

CREATE SEQUENCE riik_id_seq;
ALTER TABLE riik ALTER id SET DEFAULT NEXTVAL('riik_id_seq');

See aga on ekvivalentne serial andmetüübi kasutamisega tabeli loomisel:

CREATE TABLE riik (
    id serial PRIMARY KEY,
    kood varchar(2) UNIQUE,
    nimi varchar(20)
)

Lisame mõned andmed tabelisse:

INSERT INTO riik (kood, nimi) VALUES ('ee', 'Eesti');
INSERT INTO riik (kood, nimi) VALUES ('fi', 'Soome');
INSERT INTO riik (kood, nimi) VALUES ('lv', 'Läti');
INSERT INTO riik (kood, nimi) VALUES ('lt', 'Leedu');

Teeme päringu:

SELECT * FROM riik;

Ja veendume et kõik on õige:

 id | kood | nimi
----+------+-------
  1 | ee   | Eesti
  2 | fi   | Soome
  3 | lv   | Läti
  4 | lt   | Leedu
(4 rows)

Tulba kitsenduseks võib seada ka mõne teise tabeli tulba:

CREATE TABLE linn (
    id SERIAL,
    riik_kood VARCHAR(2),
    nimi VARCHAR(20)
);

ALTER TABLE linn
    ADD CONSTRAINT linn_riik_fkey
        FOREIGN KEY (riik_kood) REFERENCES riik (kood);

Proovides lisada säärasesse tabelisse linna, mille riigi koodi pole defineeritud:

INSERT INTO linn (riik_kood, nimi) VALUES ('zz', 'Tallinn');

Saame vastuseks veateate:

ERROR:  insert or update on table "linn" violates foreign key constraint "linn_riik_fkey"
DETAIL:  Key (riik_kood)=(zz) is not present in table "riik".

Ebaõnnestunud kitsendusi saab ka eemaldada:

ALTER TABLE linn DROP CONSTRAINT linn_riik_fkey
1

http://www.postgresql.org/docs/9.1/static/sql-createtable.html

2

http://www.postgresql.org/docs/9.1/static/sql-createindex.html

Postgres SQL