Miten voin luoda kahden eri kannoissa olevien taulujen välille triggerin, joka "nuuskii" ekassa taulussa tapahtuvia muutoksia tietyssä kentässä (eli sarakkeessa) ja päivityksen tapahtuessa (UPDATE tai INSERT) tämä käy päivittämässä myös toisessa taulussa olevat näitä vastaavat tiedot? Jos mahdollista niin jokin yksinkertaistettu esimerkki. Syntaksi lienee jotakin tyyliin (?):
CREATE TRIGGER triggerin_nimi
AFTER UPDATE ON taulu_1
FOR EACH ROW
BEGIN
UPDATE taulu_2
SET jokin_kenttä = jokin_toinen_kenttä
END
Olenko ihan hakoteillä...?
Kiitos vastauksista.
Triggereiden käyttö
5
581
Vastaukset 5
- lähellä
>Olenko ihan hakoteillä...?
Et suinkaan.
Pienenä tarkennuksena voi tietysti mainita että trigger ei ole mitenkään sidottu kahden taulun välille vaan sen liipaisun aiheuttamia toimia voi tehdä mille tahansa taululle.
Lisätietoja tuolta:
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html - I.Proqatlis
Tästä on varmasti Sinulle hyötyä:
http://keskustelu.suomi24.fi/show.fcgi?category=108&conference=4500000000000137&posting=22000000022667597
Lue myös muut tuossa ketjussa olevat viestit asian ymmärtämiseksi.- MySQL aloittelija
Ongelma johtui DELIMITER:n puuttumisesta. Nyt seuraa jatkokysymys: miten saan selville, mitä riviä triggeri kulloinkin on käsittelemässä? Saako tämän jollakin tavalla esim. muuttujan sisällöksi, jota sql-koodi käyttää eri toimenpiteisiin identifioidessaan mille riville vastaavat tiedot pitää päivittää toisessa taulussa?
- I.Proqatlis
MySQL aloittelija kirjoitti:
Ongelma johtui DELIMITER:n puuttumisesta. Nyt seuraa jatkokysymys: miten saan selville, mitä riviä triggeri kulloinkin on käsittelemässä? Saako tämän jollakin tavalla esim. muuttujan sisällöksi, jota sql-koodi käyttää eri toimenpiteisiin identifioidessaan mille riville vastaavat tiedot pitää päivittää toisessa taulussa?
Sain vaikutelman, ettet oikein ymmärtänyt esimerkeissä olleita ideoita. Katsotaanpa tätä hieman tarkemmin.
Meillä on siis seuraavat taulut:
Pelaajat
--------
id
etunimi
sukunimi
tehdyt_maalit
syotetyt_maalit
Maalit
------
aika
tekija (pakollinen kenttä, siis NOT NULL)
syottaja (ei pakollinen kenttä, koska syöttäjää ei välttämättä ole, NULL-arvot sallittuja)
Meillä on kolme triggeriä, jotka reagoivat, kun maalit-taulussa tapahtuu jotain – kun rivejä lisätään, poistetaan tai päivitetään. Tämä alempana oleva triggeri nuuskii, tapahtuiko tekijän tai syöttäjän muutos. Jos tapahtui, niin pelaajat-taulussa olevia laskureita päivitetään.
Seuraava on tärkeä ymmärtää:
Mistä tietää, muutettiinko maalin tekijää?
Systeemillä on tiedossaan kenttien arvot ennen ja jälkeen päivityksen. Näihin voidaan viitata käyttäen etuliitteitä NEW tai OLD. Triggerin ensimmäisellä rivillä on tämä tutkimus:
if NEW.tekija OLD.tekija.
Jos todetaan tämän olevan totta – siis tekijää ollaan vaihtamassa – tehdään kaksi päivitystä pelaajat-tauluun. Aluksi vähennetään 1 maali siltä pelaajalta, jolle maali ensin oli kirjattu. Where-ehdossa kirjoitetaan tällöin id = OLD.tekija. Tämän jälkeen lisätään 1 maali sille pelaajalle, joka korjattiin maalintekijäksi. Tähän viitataan sanomalla id = NEW.tekija.
Siis kulloinkin triggerissä päivitettävänä olevan rivin arvoihin voidaan viitata käyttämällä etuliitteitä NEW tai OLD. Tätähän sinä et kaiketi oikein ymmärtänyt? Huomaa myös, että jos rivi on uusi, niin vain NEW-arvoja on olemassa. Poistoa tehtäessä vain OLD-arvot ovat olemassa.
Sitten seuraa vastaava tutkimus maalin syöttäjästä. Tässä tehdään samantapaiset operaatiot kuin edellä.
CREATE TRIGGER tekija_korjaus after UPDATE ON maalit
FOR EACH ROW
BEGIN
if NEW.tekija OLD.tekija then
UPDATE pelaajat
SET tehdyt_maalit = tehdyt_maalit - 1
WHERE id = OLD.tekija;
UPDATE pelaajat
SET tehdyt_maalit = tehdyt_maalit 1
WHERE id = NEW.tekija;
end if;
if ifnull(NEW.syottaja, 0) ifnull(OLD.syottaja, 0) then
if OLD.syottaja is not null then
UPDATE pelaajat
SET syotetyt_maalit = syotetyt_maalit - 1
WHERE id = OLD.syottaja;
end if;
if NEW.syottaja is not null then
UPDATE pelaajat
SET syotetyt_maalit = syotetyt_maalit 1
WHERE id = NEW.syottaja;
end if;
end if;
END - MySQL aloittelija
I.Proqatlis kirjoitti:
Sain vaikutelman, ettet oikein ymmärtänyt esimerkeissä olleita ideoita. Katsotaanpa tätä hieman tarkemmin.
Meillä on siis seuraavat taulut:
Pelaajat
--------
id
etunimi
sukunimi
tehdyt_maalit
syotetyt_maalit
Maalit
------
aika
tekija (pakollinen kenttä, siis NOT NULL)
syottaja (ei pakollinen kenttä, koska syöttäjää ei välttämättä ole, NULL-arvot sallittuja)
Meillä on kolme triggeriä, jotka reagoivat, kun maalit-taulussa tapahtuu jotain – kun rivejä lisätään, poistetaan tai päivitetään. Tämä alempana oleva triggeri nuuskii, tapahtuiko tekijän tai syöttäjän muutos. Jos tapahtui, niin pelaajat-taulussa olevia laskureita päivitetään.
Seuraava on tärkeä ymmärtää:
Mistä tietää, muutettiinko maalin tekijää?
Systeemillä on tiedossaan kenttien arvot ennen ja jälkeen päivityksen. Näihin voidaan viitata käyttäen etuliitteitä NEW tai OLD. Triggerin ensimmäisellä rivillä on tämä tutkimus:
if NEW.tekija OLD.tekija.
Jos todetaan tämän olevan totta – siis tekijää ollaan vaihtamassa – tehdään kaksi päivitystä pelaajat-tauluun. Aluksi vähennetään 1 maali siltä pelaajalta, jolle maali ensin oli kirjattu. Where-ehdossa kirjoitetaan tällöin id = OLD.tekija. Tämän jälkeen lisätään 1 maali sille pelaajalle, joka korjattiin maalintekijäksi. Tähän viitataan sanomalla id = NEW.tekija.
Siis kulloinkin triggerissä päivitettävänä olevan rivin arvoihin voidaan viitata käyttämällä etuliitteitä NEW tai OLD. Tätähän sinä et kaiketi oikein ymmärtänyt? Huomaa myös, että jos rivi on uusi, niin vain NEW-arvoja on olemassa. Poistoa tehtäessä vain OLD-arvot ovat olemassa.
Sitten seuraa vastaava tutkimus maalin syöttäjästä. Tässä tehdään samantapaiset operaatiot kuin edellä.
CREATE TRIGGER tekija_korjaus after UPDATE ON maalit
FOR EACH ROW
BEGIN
if NEW.tekija OLD.tekija then
UPDATE pelaajat
SET tehdyt_maalit = tehdyt_maalit - 1
WHERE id = OLD.tekija;
UPDATE pelaajat
SET tehdyt_maalit = tehdyt_maalit 1
WHERE id = NEW.tekija;
end if;
if ifnull(NEW.syottaja, 0) ifnull(OLD.syottaja, 0) then
if OLD.syottaja is not null then
UPDATE pelaajat
SET syotetyt_maalit = syotetyt_maalit - 1
WHERE id = OLD.syottaja;
end if;
if NEW.syottaja is not null then
UPDATE pelaajat
SET syotetyt_maalit = syotetyt_maalit 1
WHERE id = NEW.syottaja;
end if;
end if;
ENDTämä tieto oli ratkaiseva!
"Systeemillä on tiedossaan kenttien arvot ennen ja jälkeen päivityksen. Näihin voidaan viitata käyttäen etuliitteitä NEW tai OLD."
Kiitän!
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Mikä on totta mikä ei?
Onko juoru vai ei että nimeltä mainitsematon henkilö on tehnyt naiselle/naisille jotain joka on väärin?212294Päivän aivopieru Trumpilta
Trump julisti sodan hyttysiä vastaan. Myös punkit ovat Trumpin sodan kohteena. Eikö vieläkään USA:n kansa tajua tuon uko861526- 132968
Just saying
Mies joka antaa naiselle turvallisen olon, on seksikäs. Ei kieroja kikkoja ja haluaa olla vain sen yhden naisen mies.142745Löytyikö syy miksi Martina on Muhiksen kanssa
Saipa naurut Gekkosen kuvasta, missä ovat ravintola Hookissa Immu fight night ottelun jälkeen, Muhoksella pullottaa hirv95682- 54676
- 13647
Jorma Uotinen läväytti härskin heiton - Paljastus uudesta TTK-romanssista?
Tuomari Jorma Uotisen linja on välillä hyvinkin rohkea TTK:ssa. Hän näpäytti Jaakko Parkkalille ja Kastanja Rauhalalle v12608Jos selviäisi että kaivattusi
Olisi savant asperger? Rakastaisitko vielä? Savant-lahjakkuus olisi kapea-alaista neroutta liittyen mekanisiin ja tilan96602On väärin
Tykätä ja haluta sua kun tilanne täysin mahdoton mutta minkäs teet. Mun sisällä roihuaa 🔥 kunpa tietäisit mitä sä minus42562- 65561
Toivotko vielä viestiä
Minulta? En rohkene enää ottaa yhteyttä, kun varmasti jo uusia naisia elämässä. Nolaisin vain itseni.44559Jokin ei täsmää
Joskus yksi vuosiluku saa katsomaan koko tarinaa uudestaan. Löysin gradun. Matematiikka ei oikein täsmää siihen, mitä mi298556- 42525
- 138521
Älä unohda minua
Nainen ethän unohda minua. Asiat olisivat voineet mennä toisin, olisi vain pitänyt uskaltaa lähestyä sinua kun annoit si66509Oliko Jani Halmeen aika jo tippua TTK:sta?
Jani Halme ja Claudia Ketonen joutuivat jättämään TTK:n. Halme ja Ketonen saivat viimeiseksi jäänestä tanssista, sambas28508- 77504
Kuka kaipaa T m?
Kerro nainen kirjaimesi vaan... Haluan miettiä kuka tulee ekana mieleeni.. kuin kurkistus tunteiden meren pinnalle, jota36500Miksi jotku naiset on niin tyhmiä
Että elättelevät turhaa toivoa toisen kustannuksella. Onko ne kaikki kaappilesboja vai mikä niitä vaivaa? Sitten itketä54498