Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Andmebaasid
II praktikum
Tabelite loomine, veergude ja
tabelite kitsendused
TABELITE LOOMINE
2
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
Süntaks
• CREATE TABLE <nimi> ( ....);
– Sulgudes (komaga eraldatult):
• Veergude definitsioonid
• Tabeli üldised kitsendused (constraints)
4
Veeru definitsioon
Veeru nimi
Veeru andmetüüp
[NOT NULL]
[DEFAULT <vaikeväärtus>]
[kitsendused]
5
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
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
Vaikeväärtused
CURRENT ...
CURRENT_TIME, CURRENT_DATE,
CURRENT_TIMESTAMP, CURRENT_USER
AUTOINCREMENT
NULL (taastamiseks)
8
Vaikeväärtused (SQL Anywhere)
CURRENT - alakriipsu asemel tühik!
CURRENT TIMESTAMP, ...
TIMESTAMP
Täiendavalt, NB! Ilma sõnata CURRENT!
GLOBAL AUTOINCREMENT
Replikeerimise jaoks
9
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
Tabeli kitsendused
• Hõlmavad üldjuhul rohkem kui ühte veergu
CONSTRAINT pk_isik PRIMARY KEY (eesnimi, perenimi,
synnipaev);
CONSTRAINT chk_palk CHECK (brutopalk > netopalk);
11
Tabeli kustutamine
• DROP TABLE <nimi>;
12
Ü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
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
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
MASSANDMED
SISESTAMINE FAILIST
16
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
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
TABELI DEFINITSIOONI
MUUTMINE
19
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
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
Nimemuutuse näidis
Veeru nime muutmine:
ALTER TABLE turniir RENAME nimetus TO nimi;
22
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
Nimelise kitsenduse lisamine
ALTER TABLE isik ADD CONSTRAINT
un_nimi UNIQUE (eesnimi, perenimi);
24
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
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
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
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
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
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
Ülemtabeli muutused
Mida saab ülemtabeliga teha:
Kustutada kirje (DELETE)
Muuta unikaalsust (võtme väärtust)
(UPDATE)
31
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
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
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
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
Ü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
Ü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
Kokkuvõtvalt: Andmete sisestus muutmine ja kustutamine
38
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
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
Muutmine (UPDATE)
• UPDATE <tabel> SET <veerg> = <väärtus> WHERE <tingimus>; – (=NULL ei ole lubatud)
– Tingimus – vaatame esialgu lihtsamat varianti: võtmevälja tingimus
41
KUSTUTAMINE
DELETE FROM <tabel> WHERE <tingimus>;
NB! Mis juhtub, kui tingimus ÄRA UNUSTADA?
42
Ü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