Commit 104ea316 authored by K9272's avatar K9272
Browse files

H6

parent 23c78470
# Viikko 6 SQL: Taulujen luonti, muokkaus, poisto, tietojen ylläpito insert/update. Harjoitustyön alustus.
Tehtävä 1 [3p]
Luo Persons-niminen tietokannan taulu, jossa on sarakkeet
* `hetu`, kiinteämittainen merkkijono 11 merkkiä, perusavain
* `sukunimi`, vaihtuvamittainen merkkijono max 64 merkkiä, pakollinen
* `etunimi`, vaihtuvamittainen merkkijono max 64 merkkiä, pakollinen
* `email`, vaihtuvamittainen merkkijono max 128 merkkiä, ei ole pakollinen, mutta kahta täsmälleen samanlaista sähköpostiosoitetta ei voi tallentaa
* `biologinen_sukupuoli`, vaihtuvamittainen merkkijono max 32 merkkiä, pakollinen. Sallitut arvot ovat vain mies, nainen, intersukupuolinen.
* `fobia`, vaihtuvamittainen merkkijono max 64 merkkiä, pakollinen, oletusarvo on hippopotomonstrosesquippedaliofobia
Tämän tehtävän vastauksena tulee palauttaa SQL-lause taulun luomiseksi sekä desc Persons-käskyn tulostus ja mahdolliset lisäkommentit.
```
CREATE TABLE Persons (
hetu CHAR(11) PRIMARY KEY,
sukunimi VARCHAR(64) NOT NULL,
etunimi VARCHAR(64) NOT NULL,
email VARCHAR(128) UNIQUE,
biologinen_sukupuoli VARCHAR(32) NOT NULL, CHECK (biologinen_sukupuoli in ("mies","nainen","intersukupuolinen")),
fobia VARCHAR(64) NOT NULL DEFAULT "hippopotomonstrosesquippedaliofobia"
)
ENGINE = InnoDB;
```
```
MariaDB [H6]> desc Persons;
+----------------------+--------------+------+-----+-------------------------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+--------------+------+-----+-------------------------------------+-------+
| hetu | char(11) | NO | PRI | NULL | |
| sukunimi | varchar(64) | NO | | NULL | |
| etunimi | varchar(64) | NO | | NULL | |
| email | varchar(128) | YES | UNI | NULL | |
| biologinen_sukupuoli | varchar(32) | NO | | NULL | |
| fobia | varchar(64) | NO | | hippopotomonstrosesquippedaliofobia | |
+----------------------+--------------+------+-----+-------------------------------------+-------+
6 rows in set (0.014 sec)
```
## Tehtävä 2 [3p]
Lisää `INSERT INTO` -lausein tehtävän 1 Persons-tauluun oheinen sisältö. Vainion Viljan fobia tulee tallentua ilman, että kirjoitat sitä näkyviin INSERT INTO -lauseessasi
```
mysql> select * FROM Persons;
+-------------+----------+---------+----------------+----------------------+-------------------------------------+
| hetu | sukunimi | etunimi | email | biologinen_sukupuoli | fobia |
+-------------+----------+---------+----------------+----------------------+-------------------------------------+
| 121212-1234 | Guru | Ken | NULL | intersukupuolinen | fobofobia |
| 121212-1235 | Vainio | Elo | elo@mail.com | mies | panofobia |
| 121212-1236 | Vainio | Vilja | vilja@mail.com | nainen | hippopotomonstrosesquippedaliofobia |
+-------------+----------+---------+----------------+----------------------+-------------------------------------+
3 rows in set (0.00 sec)
```
```
INSERT INTO Persons
-> VALUES("121212-1234","Guru","Ken",NULL,"intersukupuolinen","fobofobia");
Query OK, 1 row affected (0.004 sec)
MariaDB [H6]> INSERT INTO Persons
-> VALUES("121212-1235","Vainio","Elo","elo@mail.com","mies","panofobia");
Query OK, 1 row affected (0.002 sec)
MariaDB [H6]> INSERT INTO Persons(hetu,etunimi,sukunimi,email,biologinen_sukupuoli)
-> VALUES("121212-1236","Vainio","Vilja","vilja@mail.com","nainen"); -- VÄÄRÄSSÄ JÄRJESTYKSESSÄ ETU- JA SUKUNIMI
Query OK, 1 row affected (0.003 sec)
MariaDB [H6]> SELECT * FROM Persons;
+-------------+----------+---------+----------------+----------------------+-------------------------------------+
| hetu | sukunimi | etunimi | email | biologinen_sukupuoli | fobia |
+-------------+----------+---------+----------------+----------------------+-------------------------------------+
| 121212-1234 | Guru | Ken | NULL | intersukupuolinen | fobofobia |
| 121212-1235 | Vainio | Elo | elo@mail.com | mies | panofobia |
| 121212-1236 | Vilja | Vainio | vilja@mail.com | nainen | hippopotomonstrosesquippedaliofobia |
+-------------+----------+---------+----------------+----------------------+-------------------------------------+
3 rows in set (0.000 sec)
```
Osoita INSERT INTO -lausein, että Persons-tauluun ei voi lisätä rivejä joissa
A. sukupuoli ei ole sallittujen sukupuolten joukossa
B. email on täsmälleen sama kuin jollakin jo tauluun jo tallennetulla henkilölllä
C. hetu on liian pitkä
Tämän tehtävän vastauksena tulee palauttaa kaikki käyttämäsi INSERT INTO -lauseet (6kpl) ja virheilmoitukset näiden kolmen viimeisen INSERT INTO -operaation epäonnistumisesta.
```
MariaDB [H6]> INSERT INTO Persons
-> VALUES("121212-1237","Mikko","Kuusi","kuusi@puu.com","havunlehvä","agoraphobia");
ERROR 4025 (23000): CONSTRAINT `CONSTRAINT_1` failed for `h6`.`persons`
MariaDB [H6]> INSERT INTO Persons
-> VALUES("121212-1237","Mikko","Kuusi","elo@mail.com","mies","agoraphobia");
ERROR 1062 (23000): Duplicate entry 'elo@mail.com' for key 'email'
MariaDB [H6]> INSERT INTO Persons
-> VALUES("121212-12371","Mikko","Kuusi","kuusi@puu.com","mies","agoraphobia");
Query OK, 1 row affected, 2 warnings (0.003 sec)
```
Liian pitkä hetu antaa varoituksen, mutta lisää silti lyhennettynä tauluun!
Lyhennetyn (virheellisen) datan lisääminen voidaan estää asettamalla SQL-moodiksi "STRICT_ALL_TABLES"
```
MariaDB [H6]> SET sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.000 sec)
MariaDB [H6]> INSERT INTO Persons
-> VALUES("121212-12371","Mikko","Kuusi","kuusi@puu.com","mies","agoraphobia");
ERROR 1406 (22001): Data too long for column 'hetu' at row 1
```
## Tehtävä 3 [6p]
Tässä tehtävässä tarvitaan tehtävissä 1 ja 2 luotua Persons-taulua 3 rivin sisältöineen.
Luo lisäksi taulu PhoneManufacturers, jossa on sarakkeet
(1A)id, kokonaisluku, automaattisesti kasvava sarake, pakollinen, perusavain
(1B) manufacturer, vaihtuvamittainen merkkijono max 32 merkkiä, pakollinen
Luo lisäksi taulu PhoneNumbers, jossa on sarakkeet
```
MariaDB [H6]> CREATE TABLE PhoneManufacturers(
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> manufacturer VARCHAR(32) NOT NULL
-> );
Query OK, 0 rows affected (0.032 sec)
```
(2A)phonenumber, vaihtuvamittainen merkkijono max 64 merkkiä, pakollinen, perusavain
(2B) hetu, kiinteämittainen merkkijono 11 merkkiä, pakollinen. Tämä sarake toimiii viiteavaimena Persons-taulun hetu-sarakkeeseen (perusavain). Vyörytyssääntönä on sekä DELETE- että UPDATE-operaatioille kieltää sellaisten isätaulun henkilöiden poistaminen/muuttaminen, joilla on puhelinnumeroita.
(2C) manufacturerID, kokonaisluku, ei pakollinen, oletusarvo NULL. Tämä sarake toimiii viiteavaimena PhoneManufacturers-taulun id-sarakkeeseen (perusavain). Vyörytyssääntönä on sekä DELETE- että UPDATE-operaatioille asettaa isätaulun valmistajaksi NULL silloin, kun ollaan poistamassa/muuttamassa sellaisen valmistajan tietoja, joihin on liitettynä puhelinnumeroita.
```
CREATE TABLE PhoneNumbers(
phonenumber VARCHAR(64) PRIMARY KEY,
hetu CHAR(11) NOT NULL,
manufacturerID INT NULL DEFAULT NULL,
CONSTRAINT fk_hetu FOREIGN KEY (`hetu`)
REFERENCES `Persons` (`hetu`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_manufacturerID FOREIGN KEY (`manufacturerID`)
REFERENCES `PhoneManufacturers` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL
);
```
Lisää INSERT INTO -lausein PhoneManufacturers-tauluun puhelinvalmistaja Samsung ja Apple.
```
MariaDB [H6]> INSERT INTO PhoneManufacturers(manufacturer) VALUES
-> ("Samsung"),
-> ("Apple");
Query OK, 2 rows affected (0.002 sec)
Records: 2 Duplicates: 0 Warnings: 0
```
Lisää henkilölle Ken Guru puhelin numeroineen, jonka valmistaja on Samsung. Lisää henkilöille Elo Vainio ja Vilja Vainio puhelimet numeroineen, joiden valmistaja on Apple.
```
MariaDB [H6]> INSERT INTO PhoneNumbers(phonenumber,hetu,manufacturerID) VALUES
-> ("0449348123","121212-1234",1),
-> ("0403123398","121212-1235",2),
-> ("0403123399","121212-1236",2);
Query OK, 3 rows affected (0.004 sec)
Records: 3 Duplicates: 0 Warnings: 0
```
Poista PhoneManufacturers-taulusta valmistaja Samsung ja totea että käyttäjän Ken Guru puhelinvalmistaja on NULL tämän operaation jälkeen.
```
MariaDB [H6]> DELETE FROM PhoneManufacturers WHERE manufacturer = "Samsung";
Query OK, 1 row affected (0.002 sec)
MariaDB [H6]> SELECT * FROM Phonenumbers;
+-------------+-------------+----------------+
| phonenumber | hetu | manufacturerID |
+-------------+-------------+----------------+
| 0403123398 | 121212-1235 | 2 |
| 0403123399 | 121212-1236 | 2 |
| 0449348123 | 121212-1234 | NULL |
+-------------+-------------+----------------+
3 rows in set (0.000 sec)
```
Yritä poistaa käyttäjä Vilja Vainio Persons-taulusta ja totea, että poisto ei onnistu vyörytyssääntöjen takia.
```
MariaDB [H6]> DELETE FROM Persons WHERE etunimi = "Vainio" AND sukunimi = "Vilja"; -- Sukunimi ja etunimi insertissä väärinpäin! :D
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`h6`.`phonenumbers`, CONSTRAINT `fk_hetu` FOREIGN KEY (`hetu`) REFERENCES `persons` (`hetu`) ON DELETE NO ACTION ON UPDATE NO ACTION)
```
Tämän tehtävän vastauksena tulee palauttaa kaikki tehtävän ratkaisemiseksi käyttämäsi SQL-lauseet ja mahdolliset näytteet operaatioiden onnistumisesta tai epäonnistumisista.
## Tehtävä 4 [6p]
Tee alustava karkea harjoitustyön suunnitelma. Pyri vastaamaan suunnitelmalla seuraaviin kysymyksiin
* Mikä on harjoitustyösi aihe?
* Millainen voisi olla ytimekäs muutaman virkkeen toimeksianto * harjoitustyöllesi?
* Mitkä ovat kaikista keskeisimmät asiat, joista tietoa tallennetaan tietokantaan?
* Millaiset voisivat olla ihan keskeisimmät käsitteet/taulut, joita harjoitustyössäsi tarvitaan? Voit piirtää halutessasi kaavion ihan kynälllä paperille (palautukseen kuva), draw.io:lla jne.
* Mikä on alustava harjoitustyöryhmäsi kokoonpano?
* Muuta?
Tämän suunnitelman ei tarvitse toteutua, mutta jokaisen tästä tehtävästä pisteitä haluavan on esitettävä tässä vaiheessa tämä suunnitelma. Kaikki samaan ryhmään (tässä vaiheessa) kuuluvat voivat esittää saman suunnitelman.
Suunnitelman laajuus A4-tulosteena noin 1/2-1 sivua!
Palautusformaatti vapaa
## Tietokanta sovellukseen, jolla prosessoidaan (maanmittauslaitoksen) ortoilmakuvia Microsoft Flight Simulatorissa käytettäväksi maaston tekstuuriksi.
Työn tekijä: Teemu Koskinen
Suomesta tuotetaan ilmakuvausaineistoa vuosittain kevään - kesän aikana suoritettavilla ilmakuvauksilla. Maanmittauslaitos jalostaa kuvat UTM-karttalehtijaon mukaan jaetuiksi ortokuviksi. Yksittäinen kuvausalue kattaa 2-3000 neliökilometriä, jonka kuvausaika ja laatu voidaan arvoida "yhtenä könttänä". Soveltuvat kuvausalueet prosessoidaan "tiileiksi", joka voidaan esimerkiksi syöttää erillisen ohjelman kautta Microsoft Flight Simulatoriin maaston tekstuuriksi.
Lähdetiedostoista tärkeitä tallennettavia arvoja `karttalehden tunnus`, `tiedostopolku` ja `kuvausalue`.
`Kuvausalueista` tallennetaan niiden arvioitu `nimi`, `kuvausaika`, `laatu` ja `värikorjaus`.
Kohdetiileille tärkeitä arvoja ovat `tiilen tunnus (QUADKEY)` ja `käytetyt lähdetiedostot` `prosessoinnin pvm`.
(Jos tuntuu, että tämä jää vajaaksi, voidaan mahdollisesti (jopa todennäköisesti, nyt kun työn vaatimuksia tarkastelen) laajentaa koskemaan muitakin tietolajeja (Korkeusmalli, Vektoriaineistot esimerkiksi tiestöstä...), joita käytetään virtuaalisen maailman rakentamiseen.)
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment