Commit d6588cad authored by M1888's avatar M1888

v3

parent 7e10a13e
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Tietokannat (TTZC0800) kurssin harkkatyö Tietokannat (TTZC0800) kurssin harkkatyö
## Suunnitelmavaihe: ## Suunnitelmavaihe
**[Vaatimusmäärittelyyn](vaatimusmaarittely.md)** tästä. **[Vaatimusmäärittelyyn](vaatimusmaarittely.md)** tästä.
...@@ -21,7 +21,7 @@ Lähdettäessä toteuttamaan vaatimusmäärittelyn mukaista ensimmäistä versio ...@@ -21,7 +21,7 @@ Lähdettäessä toteuttamaan vaatimusmäärittelyn mukaista ensimmäistä versio
Tämä ei kuitenkaan onnistunut, vaan MySQL valitti vierasavaimien konfliktista, kun kaikista tauluista ei löytynyktään sopivaa id:tä: Tämä ei kuitenkaan onnistunut, vaan MySQL valitti vierasavaimien konfliktista, kun kaikista tauluista ei löytynyktään sopivaa id:tä:
``` ```SQL
mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUES mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUES
-> (2, 1, 1, 3*60+14); -> (2, 1, 1, 3*60+14);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`M1888`.`ottelutapahtuma`, CONSTRAINT `fk_ottelutapahtuma_maali1` FOREIGN KEY (`tapahtuma_id`) REFERENCES `maali` (`maali_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`M1888`.`ottelutapahtuma`, CONSTRAINT `fk_ottelutapahtuma_maali1` FOREIGN KEY (`tapahtuma_id`) REFERENCES `maali` (`maali_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
...@@ -29,11 +29,9 @@ mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUE ...@@ -29,11 +29,9 @@ mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUE
Takaisin suunnittelupöydän ääreen siis. Seuraava versio oli sellainen, jossa ottelutapahtuma-taulussa on oma erillinen foreign key jokaiselle ottelutapahtumatyypille, ja näistä täytetään rajoitteen avulla vain ja ainoastaan yksi. Taulun pääavain tulee ottelu_id:stä ja tästä yhdestä täytetystä FK:sta. Takaisin suunnittelupöydän ääreen siis. Seuraava versio oli sellainen, jossa ottelutapahtuma-taulussa on oma erillinen foreign key jokaiselle ottelutapahtumatyypille, ja näistä täytetään rajoitteen avulla vain ja ainoastaan yksi. Taulun pääavain tulee ottelu_id:stä ja tästä yhdestä täytetystä FK:sta.
![](er_v2.png)
Itse kirjoitettu check tätä varten meni näin: Itse kirjoitettu check tätä varten meni näin:
``` ```SQL
CONSTRAINT `CK_tapahtumaid` CHECK ( CONSTRAINT `CK_tapahtumaid` CHECK (
CASE WHEN aikalisa_id IS NULL THEN 0 ELSE 1 END + CASE WHEN aikalisa_id IS NULL THEN 0 ELSE 1 END +
CASE WHEN jaahy_id IS NULL THEN 0 ELSE 1 END + CASE WHEN jaahy_id IS NULL THEN 0 ELSE 1 END +
...@@ -42,8 +40,18 @@ Itse kirjoitettu check tätä varten meni näin: ...@@ -42,8 +40,18 @@ Itse kirjoitettu check tätä varten meni näin:
``` ```
![](er_v2.png)
Mutta edelleen törmättiin samankaltaiseen ongelmaan: Mutta edelleen törmättiin samankaltaiseen ongelmaan:
```
```SQL
mysql> INSERT INTO ottelutapahtuma (ottelu_id, jaahy_id, aika) VALUES (1, 1, 3*60+14); mysql> INSERT INTO ottelutapahtuma (ottelu_id, jaahy_id, aika) VALUES (1, 1, 3*60+14);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`M1888`.`ottelutapahtuma`, CONSTRAINT `fk_ottelutapahtuma_aikalisa1` FOREIGN KEY (`aikalisa_id`) REFERENCES `aikalisa` (`aikalisa_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`M1888`.`ottelutapahtuma`, CONSTRAINT `fk_ottelutapahtuma_aikalisa1` FOREIGN KEY (`aikalisa_id`) REFERENCES `aikalisa` (`aikalisa_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
``` ```
Googlesta ja StackOverflow'sta aikani luettuani, kokeilin pariakin eri lähestymistapaa:
- Vaihdoin ottelutapahtuma-taulun vierasavaimet UNSIGNED INT -tyyppiin
- Kokeilin määrittää kaikki muut vierasavaimet INSERTin aikana erikseen NULL-arvolle
- Vielä paria erilaista constraintia ja muuta määrettä taululle
...@@ -214,14 +214,15 @@ ENGINE = InnoDB; ...@@ -214,14 +214,15 @@ ENGINE = InnoDB;
-- Table `M1888`.`ottelutapahtuma` -- Table `M1888`.`ottelutapahtuma`
-- ----------------------------------------------------- -- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `M1888`.`ottelutapahtuma` ( CREATE TABLE IF NOT EXISTS `M1888`.`ottelutapahtuma` (
`tapahtuma_id` INT NOT NULL,
`ottelu_id` INT NOT NULL, `ottelu_id` INT NOT NULL,
`aikalisa_id` INT UNSIGNED DEFAULT NULL, `aikalisa_id` INT UNSIGNED NULL,
`jaahy_id` INT UNSIGNED DEFAULT NULL, `jaahy_id` INT UNSIGNED NULL,
`rankkari_id` INT UNSIGNED DEFAULT NULL, `rankkari_id` INT UNSIGNED NULL,
`maali_id` INT UNSIGNED DEFAULT NULL, `maali_id` INT UNSIGNED NULL,
`aika` INT NOT NULL, `aika` INT NOT NULL,
INDEX `fk_ottelutapahtuma_ottelu1_idx` (`ottelu_id` ASC), INDEX `fk_ottelutapahtuma_ottelu1_idx` (`ottelu_id` ASC),
PRIMARY KEY (`ottelu_id`, `aikalisa_id`, `jaahy_id`, `rankkari_id`, `maali_id`), PRIMARY KEY (`tapahtuma_id`, `ottelu_id`),
INDEX `fk_ottelutapahtuma_aikalisa1_idx` (`aikalisa_id` ASC), INDEX `fk_ottelutapahtuma_aikalisa1_idx` (`aikalisa_id` ASC),
INDEX `fk_ottelutapahtuma_jaahy1_idx` (`jaahy_id` ASC), INDEX `fk_ottelutapahtuma_jaahy1_idx` (`jaahy_id` ASC),
INDEX `fk_ottelutapahtuma_rangaistuslaukaus1_idx` (`rankkari_id` ASC), INDEX `fk_ottelutapahtuma_rangaistuslaukaus1_idx` (`rankkari_id` ASC),
......
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