43
Andmebaasid II praktikum Tabelite loomine, veergude ja tabelite kitsendused

Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Andmebaasid

II praktikum

Tabelite loomine, veergude ja

tabelite kitsendused

Page 2: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

TABELITE LOOMINE

2

Page 3: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Tabelite liigid

• Baastabel

(reaalselt eksisteeriv, sisaldab andmeid, andmeid saab muuta)

• Ajutine baastabel

(sessioonipõhine)

• Vaade (lihtsustus, andmeid võib saada muuta)

(edaspidi vaadet tabeliks ei kutsu!)

3

Page 4: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Süntaks

• CREATE TABLE <nimi> ( ....);

– Sulgudes (komaga eraldatult):

• Veergude definitsioonid

• Tabeli üldised kitsendused (constraints)

4

Page 5: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Veeru definitsioon

Veeru nimi

Veeru andmetüüp

[NOT NULL]

[DEFAULT <vaikeväärtus>]

[kitsendused]

5

Page 6: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Andmetüübid (1) CHAR – 1 sümbol

VARCHAR (maksimaalne pikkus) (sümbolid = string)

LONG VARCHAR (=TEXT)

INTEGER – 4 baiti, SMALLINT – 2 baiti

BIGINT – 8 baiti, TINYINT – 1 bait

DECIMAL (kogupikkus, komatagune pikkus)

NUMERIC (kogupikkus, komatagune pikkus)

FLOAT – 4 baiti reaalarv

REAL – 4 baiti reaalarv

DOUBLE – 8 baiti reaalarv

6

Page 7: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Andmetüübid (2)

DATE – 4 baiti

DATETIME – 8 baiti

TIME – 8 baiti (string)

BIT (väärtus 0 või 1 NULL pole lubatud) – 1 bait

BINARY (max pikkus) 1 kuni 32767 vaikimisi 1 bait

LONG BINARY max väärtus 2GB -1

7

Page 8: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Vaikeväärtused

CURRENT ...

CURRENT_TIME, CURRENT_DATE,

CURRENT_TIMESTAMP, CURRENT_USER

AUTOINCREMENT

NULL (taastamiseks)

8

Page 9: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Vaikeväärtused (SQL Anywhere)

CURRENT - alakriipsu asemel tühik!

CURRENT TIMESTAMP, ...

TIMESTAMP

Täiendavalt, NB! Ilma sõnata CURRENT!

GLOBAL AUTOINCREMENT

Replikeerimise jaoks

9

Page 10: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Veeru kitsendused

• [CONSTRAINT <nimi>] {UNIQUE | PRIMARY KEY |

CHECK (tingimus)}

– NB! Tingimus sisaldab veeru nime

kaugus INTEGER NOT NULL CHECK (kaugus > 50)

• (SQL Anywhere) veel lisaks: COMPUTE (avaldis)

(Tekib read-only veerg)

10

Page 11: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Tabeli kitsendused

• Hõlmavad üldjuhul rohkem kui ühte veergu

CONSTRAINT pk_isik PRIMARY KEY (eesnimi, perenimi,

synnipaev);

CONSTRAINT chk_palk CHECK (brutopalk > netopalk);

11

Page 12: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Tabeli kustutamine

• DROP TABLE <nimi>;

12

Page 13: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Ülesanne nr 2

Luua 4 tavalist tabelit:

Isik

Id integer not null default autoincrement primary key

Eesnimi varchar (50) not null

Perenimi varchar(50) not null

Isikukood varchar(11)

Klubi integer

Unique (eesnimi, perenimi)

13

Page 14: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Klubi

Id integer not null default autoincrement primary key

Nimi varchar(100) not null unique

Turniir

Id integer not null default autoincrement primary key

Nimetus varchar(100) not null unique

Toimumiskoht varchar(100)

Alguskuupaev date not null

Loppkuupaev date

Ülesanne nr 2 (järg)

14

Page 15: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Partii

Id integer not null default autoincrement primary key

Turniir integer not null

Algushetk datetime not null default current timestamp

Lopphetk datetime

Valge integer not null

Must integer not null

Valge_tulemus smallint check (valge_tulemus in (0,1,2))

Musta_tulemus smallint check (musta_tulemus in (0,1,2))

Kokkuvote varchar(5000)

Ülesanne nr 2 (järg)

15

Page 16: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

MASSANDMED

SISESTAMINE FAILIST

16

Page 17: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

INPUT

INPUT INTO <tabel> FROM <fail> FORMAT

{ASCII | DBASEIII | FOXPRO | ....} [{veerud}]

[DELIMITED BY <eraldaja>];

Formaadil ASCII on vaikimisi eraldaja koma (,)

Eraldajaks võib olla suvaline string.

Tab- eraldatud faili kasutamiseks kood 9

17

Page 18: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

INPUT näited

INPUT INTO klubi FROM 'klubi.txt' FORMAT

ASCII DELIMITED BY '\x09';

INPUT INTO isik FROM 'isik.txt' FORMAT

ASCII DELIMITED BY '\x09' (id, eesnimi, perenimi, klubi);

Andmed Moodle’is:

Praktikumid -> Andmed (pakitud zip-failina)

18

Page 19: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

TABELI DEFINITSIOONI

MUUTMINE

19

Page 20: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Tabeli muutmise 4 tegevust

Nimemuutused: • Tabeli nime muutmine

• Veeru nime muutmine

• Kitsenduse nime muutmine

Struktuurimuutused: Veergude/kitsenduste lisamine

Veergude/kitsenduste muutmine

Veergude/kitsenduste kustutamine

20

Page 21: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Nimemuutused

Miks seda vaja on?!

Selguse huvides või veerus olevate andmete tõlgenduse muutumisel.

Tabeli nime muutmine: ALTER TABLE <tabel> RENAME <uusnimi>;

Veeru nime muutmine: ALTER TABLE <tabel> RENAME <veerunimi> TO <uusveerunimi>;

(Sarnaselt veerunimega toimitakse ka kitsenduse nimega)

21

Page 22: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Nimemuutuse näidis

Veeru nime muutmine:

ALTER TABLE turniir RENAME nimetus TO nimi;

22

Page 23: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Veeru või kitsenduse lisamine

Näiteks: ALTER TABLE klubi ADD asukoht varchar(50)

NOT NULL DEFAULT 'Tartu';

Def:

ALTER TABLE <tabel> ADD {definitsioon};

Kontrolli jaoks: SELECT * FROM klubi

23

Page 24: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Nimelise kitsenduse lisamine

ALTER TABLE isik ADD CONSTRAINT

un_nimi UNIQUE (eesnimi, perenimi);

24

Page 25: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Veeru või kitsenduse kustutamine

Näiteks:

ALTER TABLE isik DROP CONSTRAINT un_nimi;

ALTER TABLE isik DROP UNIQUE (eesnimi, perenimi);

Def:

ALTER TABLE <tabel> DROP {<veerg> |

CONSTRAINT <kitsendus> | {kitsenduse def}};

25

Page 26: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Kitsenduse muutmine Ainult CHECK on muudetav

ALTER TABLE <tabel> ALTER

<kontrollikitsendus> CHECK ({uus reegel});

Siin eraldi näidet ei tee lisame hoopis veel ühe kitsenduse

ALTER TABLE partii ADD CONSTRAINT

vastavus CHECK (valge_tulemus + musta_tulemus = 2);

Mis kitsendusega on tegemist?

26

Page 27: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Veeru muutmine

ALTER TABLE <tabel> ALTER <veerg> {uuendus};

uuendus:

SET DEFAULT {vaikeväärtus}

{ADD | DROP} CONSTRAINT <kitsendus> {def};

On võimalik anda algväärtus.

On võimalik lisada või kustutada kitsendus.

Uus veerudefinitsioon ei ole standardiga lubatud!

27

Page 28: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Veerudefinitsiooni muutmine (standardi järgi)

SQL standard – (pikk tee (4 sammu)):

ALTER TABLE klubi ADD asukoht70

varchar(70) NOT NULL DEFAULT 'Tartu';

UPDATE klubi SET asukoht70 = asukoht;

ALTER TABLE klubi DROP asukoht;

ALTER TABLE klubi RENAME asukoht70 TO asukoht;

28

Page 29: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Välisvõti (Foreign key)

• Välisvõti on seos kahe tabeli vahel.

• Võtmeveeru lubatud väärtused on defineeritud

teises tabelis. (Välisvõti on kitsendus).

– Tavamõtlemine: teise tabeli primaarvõti

Tegelikult lubatud suvaline võti (nn unikaalsuskitsendus).

• Seosel on nimi.

• Seos on veeru (või veergude komplekti) “küljes”.

29

Page 30: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Loogilised seosed (olemasolevates tabelites)

Isik (klubi) -> Klubi (id; nimi)

Partii (valge) -> Isik (id; eesnimi, perenimi)

Partii (must) -> Isik (id; eesnimi, perenimi)

Partii (turniir) -> Turniir (id; nimi)

Alamtabel -> Ülemtabel

30

Page 31: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Ülemtabeli muutused

Mida saab ülemtabeliga teha:

Kustutada kirje (DELETE)

Muuta unikaalsust (võtme väärtust)

(UPDATE)

31

Page 32: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

FK-ga defineeritud käitumine

Kuidas peab ABS käituma, kui tehakse midagi ülemtabeli

kirjega, mis võib mõjutada alamtabelit?

Keela tegevus (RESTRICT) - vaikimisi tegevus

Proovi kaasa minna (CASCADE)

Tühista seos (SET NULL)

Loo seos teatud teise kirjega (SET DEFAULT)

32

Page 33: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

FK näidis

Välisvõti isiku ja klubi tabeli vahel, mis seob väljad isik.klubi

ja klubi.id:

ALTER TABLE isik ADD CONSTRAINT fk_isik_2_klubi

FOREIGN KEY (klubi)

REFERENCES klubi (id)

ON DELETE RESTRICT ON UPDATE CASCADE;

Kehtestab kontrolli: veerus isik.klubi tohivad olla vaid veeru

klubi.id väärtused.

33

Page 34: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

FK loomise süntaks

ALTER TABLE <tabel> ADD CONSTRAINT <fk_nimi>

FOREIGN KEY ({veerud})

REFERENCES<ülemtabel>[({võtmeveerud})]

[ON DELETE {tegevus}] [ON UPDATE {tegevus}];

34

Page 35: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Optimiseerimisnõks

• Töötamisel suurte mahtudega:

– Luua struktuurid ilma võtmeteta ja

seosteta

– Importida sisse andmed

– Luua võtmed ja seosed (ning indeksid)

• Eelduseks on kvaliteetsed andmed!!!

35

Page 36: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Ülesanne (neile, kes praktikumis ei teinud)

Lisada andmed kahest TAB-eraldatud tekstifailist (klubi.txt, isik.txt) – (NB!

pakitud zip-faili).

Panna tabeli “turniir” veeru “nimetus” nimeks “nimi”

Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et

korduvaid nimesid poleks (kui taipasite nime omistada, siis ikkagi võtta maha).

Lisada sama sisuga kitsendus, kuid nimeks saagu “un_nimi”

Samasugune operatsioon tabeliga “turniir” (nime unikaalsuskitsenduse nimeks

saagu “un_nimi”)

Lisada tabelisse “klubi” asukoha jaoks kohustusliku täitega veerg, mille

vaikeväärtus (sh kõigil olemasolevatel) oleks “Tartu”, pikkusega 50.

Muuta standardijärgsete käskudega sama veeru pikkuseks 70.

36

Page 37: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Ülesanne 3

Luua 4 välisvõtit (kustutamiskeeluga, va. ühel erandjuhul)

Isik -> klubi

Partii -> Turniir – nii, et turniiri kustutamisel kaoksid kõik selle turniiri

partiid

Partii -> Isik (Valgetega mängija)

Partii -> Isik (Mustadega mängija)

Teha läbi näited:

Klubi kustutamine (ei õnnestu, kuna sellele viitab isikuid)

Klubi id muutmine (õnnestub, isikute klubi id muutub samuti)

Pärast välisvõtmete lisamist vaadata ER diagrammi Sybase Centralist.

37

Page 38: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Kokkuvõtvalt: Andmete sisestus muutmine ja kustutamine

38

Page 39: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

INSERT

• Kaks võimalust: Kas kirje kaupa või päringu põhjal

(vaatleme esimest)

• Vaikeväärtuste toimimine

INSERT INTO <tabel> ({veerud}) VALUES ({väärtused})

Väärtused:

– Literalid (numbrid, kümnenderaldajaks punkt)

– Stringid – ülakomade vahel

– Kuupäevad – ülakomade vahel: 'yyyy-mm-dd'

– Muutujad (current date jms)

39

Page 40: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

INPUT

INPUT INTO <tabel> FROM <fail> FORMAT

{ASCII | DBASEIII | FOXPRO | ....} [{veerud}]

[DELIMITED BY <eraldaja>];

Formaadil ASCII on vaikimisi eraldaja koma (,)

Eraldajaks võib olla suvaline string.

Tab- eraldatud faili kasutamiseks kood 9

40

Page 41: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Muutmine (UPDATE)

• UPDATE <tabel> SET <veerg> = <väärtus> WHERE <tingimus>; – (=NULL ei ole lubatud)

– Tingimus – vaatame esialgu lihtsamat varianti: võtmevälja tingimus

41

Page 42: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

KUSTUTAMINE

DELETE FROM <tabel> WHERE <tingimus>;

NB! Mis juhtub, kui tingimus ÄRA UNUSTADA?

42

Page 43: Andmebaasid - ut · Panna tabeli “turniir” veeru “nimetus” nimeks “nimi” Kustutada tabelist “isik” maha nimetu unikaalsuskitsendus, mis tagas, et korduvaid nimesid

Ülesanne 3 (järg)

• Lisada veel andmeid kahest TAB-eraldatud

tekstifailist (turniir.txt, partii.txt) – (NB! pakitud zipfaili).

• NB! Vaadake üle andmete struktuur ja tabeli struktuur

ja valige vastavalt failis olevatele andmetele

andmeväljad tabelis!!!

43