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