Heilleiki gagna og skorður
Heilleiki gagna er undirstöðuatriði í SQL og fyrir vikið eru settar skorður til að tryggja rétt inntak. Kynnt er hvernig aðallyklar, ytri lyklar, einstakar skorður og skilyrðisskorður eru notuð.
Heilleiki gagna og skorður
Mikilvægt er að gögn í gagnasafninu séu rétt til að koma í veg fyrir villur og gölluð gögn. Við notum skorður til að tryggja rétt inntak í töflur, eins og:
- Aðallykill (
PRIMARY KEY): Einkvæmur lykill fyrir hverja línu. - Ytri lykill (
FOREIGN KEY): Notaður til að tryggja tengsl milli tveggja tafla. - Einstakar skorður (
UNIQUE): Tryggir að dálkur sé einkvæmur. - Skilyrðisskorður (
CHECK): Tryggir að skilyrði sé uppfyllt. - NOT NULL: Tryggir að dálkur hafi gildi.
Aðallykill - PRIMARY KEY
Aðallykill er dálkur (eða safn dálka) sem ákvarðar línu einkvæmt. Dæmi um notkun aðallykils:
CREATE TABLE starfsmannalisti
(
Kennitala INTEGER PRIMARY KEY NOT NULL,
Nafn CHAR NOT NULL,
Sími CHAR,
Aldur INTEGER DEFAULT 0,
Upphafsár INTEGER CHECK (Upphafsár > 1990)
);Hér er Kennitala aðallykillinn (e. primary key), sem þarf að vera einkvæmur og ekki NULL.
Athugið: Aðallykill getur verið samsettur lykill, þar sem tvö eða fleiri dálkar mynda aðallykilinn. En ef lykill er einn dálkur, þá er hann oftast
INTEGEReðaSERIAL, og mögulega sjálfvirkt upphækkaður meðAUTOINCREMENT(þ.e.a.s. þarf ekki að setja gildi í dálkinn). Kosturinn við hafa einn dálk er að hann er þá kjörinn kandídat til að vera ytri lykill í annarri töflu.
# Ytri lykill - FOREIGN KEY Ytri lyklar eru notaðir til að viðhalda tengslum milli tveggja tafla. Dæmi um notkun ytri lykils:
CREATE TABLE nemenda_skraning
(
kennitala INTEGER REFERENCES nemendur (kennitala), -- Foreign key
namskeid_id INTEGER NOT NULL,
year INTEGER NOT NULL CHECK (year > 2010), -- Skilyrði
einkunn DECIMAL(2, 1), -- 2 stafir, 1 aukastafur
PRIMARY KEY (kennitala, namskeid_id), -- Composite primary key
FOREIGN KEY (year, namskeid_id) REFERENCES kennsluskra (year, namskeid_id) -- Composite foreign key
);Hér eru tveir ytri lyklar, kennitala og namskeid_id, sem tengjast við aðallykla í öðrum töflum. Hægt er að skilgreina ytri lykil í sömu línu og dálkagerðinn er skilgreind, eða neðst með FOREIGN KEY skipuninni. Hér þarf að passa að dálkagerðin á ytri lyklinum sé sú sama í báðum dálkum. Ekki er krafa að ytri lykillinn sé aðallykill, en skv. góðri venju er hann það yfirleitt.
Hér má líka sjá dæmi um hvernig hægt er að búa til samsettan aðallykil með PRIMARY KEY.
Einstakar skorður - UNIQUE
Einstakar skorður tryggja að öll gildi í ákveðnum dálki séu ólík. Dæmi:
CREATE TABLE kennarar
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
kennitala CHAR(10) UNIQUE,
nafn CHAR(50) NOT NULL
);Þegar UNIQUE er sett á dálk, þá er gildið í dálkinum einkvæmt. Hér hefði kennitala alveg eins getað verið aðallykillinn. En yfirleitt viljum við að aðallykillinn sé heiltala og sjálfvirkt upphækkaður.
Athugið: - Ytri lyklar: Oftast er æskilegt að gera ytri lykla á primary lykla, þar sem það auðveldar tengsl milli tafla. - Plássnýting: Til að halda gagnagrunninum eins „nettum“ og mögulegt er, er gott að reyna að hafa minnstu mögulegu dálkagerð. Til dæmis, að nota
SMALLINTí staðINTEGEReðaCHAR(10)í staðCHAR(20), þar sem við vitum að kennitölur verða aldrei lengri en 10 stafir. - Einkvæm gildi: Það er ekki æskilegt að hafanafnsem einstaka skorðu, því innan VON eru t.d. alnafnarnir Gunnar Stefánsson.
Skilyrðisskorður - CHECK
Skilyrðisskorður leyfa aðeins gildi sem uppfylla tiltekin skilyrði. Dæmi:
CREATE TABLE vörur
(
vöruID INTEGER PRIMARY KEY,
verð DECIMAL CHECK (verð > 0)
);Hér er verið að tryggja að verð vörunnar sé alltaf stærra en 0. Skilyrðisskorður geta verið margar og flóknar, og þau geta verið á einum eða mörgum dálkum.
Þegar skilyrðisskorður eru settar á töflu, þá er ekki hægt að setja inn nýjar línur (eða uppfæra dálkinn) sem brjóta skilyrðið.
NOT NULL skorður
Þegar dálkur er skilgreindur með NOT NULL, þá tryggir það að dálkurinn hafi alltaf gildi. Dæmi:
CREATE TABLE kennarar
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
kennitala CHAR(10) UNIQUE NOT NULL,
nafn CHAR(50) NOT NULL
);Hér verður að bæta við kennitölu og nafni fyrir hvern kennara, annars er ekki hægt að setja línuna inn.
Að bæta við skorðum eftir að töflur hafa verið búnar til
Ef skorður eru ekki skilgreindar strax þegar töflur eru búnar til, þá er hægt að bæta þeim við eftir á í PostgreSQL með því að nota ALTER TABLE skipunina. Dæmi:
ALTER TABLE kennarar
ADD CONSTRAINT unique_kennitala UNIQUE (kennitala);Hér er bætt við einstakri skorðu á kennitala dálkinn í töflunni kennarar. Athugið að nafnið kennarar_kennitala_unique er valið af notandanum og getur verið hvað sem er. Þegar skorða er búin til með CREATE TABLE þá er nafnið á skorðunni sjálfgefið.
Athugið: Í SQLite er ekki hægt að bæta við skorðum eins og UNIQUE eftir að taflan hefur verið búin til. Heldur þarf að framkvæma eftirfarandi aðgerðir: 1. Búa til nýja töflu með
UNIQUEskorðu. 2. Flytja gögnin úr gömlu töflunni yfir í þá nýju. 3. Eyða gömlu töflunni. 4. Endurnefna nýju töfluna í gamla nafnið.
Eyða skorðum úr töflu
Til að eyða skorðum úr töflu er hægt að nota ALTER TABLE skipunina með DROP CONSTRAINT. Dæmi:
ALTER TABLE kennarar
DROP CONSTRAINT kennarar_kennitala_unique;Athugið: Í SQLite er ekki hægt að eyða skorðum úr töflu með
ALTER TABLE. Þá þarf að búa til nýja töflu án skorða, flytja gögnin yfir og eyða gömlu töflunni og endurnefna nýju töfluna í gamla nafnið.
Skoða skorður í töflu
Til að skoða skorður í SQLite töflu er hægt að nota PRAGMA skipunina með table_info. Dæmi:
PRAGMA table_info(kennarar);Í PostgreSQL er hægt að skoða skorður með pg_constraint töflunni. Dæmi:
SELECT
conname AS constraint_name,
contype AS constraint_type,
a.attname AS column_name
FROM
pg_constraint AS c
JOIN
pg_attribute AS a ON a.attnum = ANY(c.conkey)
WHERE
c.conrelid = 'kennarar'::regclass;sem skilar öllum skorðum í töflunni kennarar.
En yfirleitt er nóg að skoða töfluna sjálfa til að sjá skorður sem eru skilgreindir, t.d. með \d kennarar (hér er gert ráð fyrir að þið séuð í psql).