Triggereiden käyttö

MySQL aloittelija

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.

5

563

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 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
      • 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;

        END

        Tä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

    1. Persujen kannatusromahdus ilahduttaa

      Siin' ei hyvä häviä. Luotto parempaan tulevasuuteen alkaa taas palautua.
      Maailman menoa
      202
      4770
    2. Avopuoliso, mies-/naisystävä vai mikä?

      Kävin eilen irl keskustelun, joka jätti minut pohtimaan seuraavaa ... millä nimityksellä kutsua henkilöä, jonka kanssa o
      Ikävä
      210
      3531
    3. Huvittava ilmiö: Vasemmistolaiset uskoo sokeasti SDP:n parantavan heidän

      elämäänsä, jos demarit johtaa seuraavaa hallitusta (Kyse on siis palstan vasemmistolaisista) Totuus on toinen, nimittäi
      Maailman menoa
      121
      2962
    4. Pitkän päivän ilta

      Tarina elämättömästä miehestä, jonka elämän täytti velvollisuudentunto. Pikkutarkka, huolellinen, hyvällä katsottu, miel
      Ikävä
      156
      2942
    5. Riikka ohoi! Saksa alensi bensaveroa, missä euron bensa?

      Perussuomalaisten yksi vaalilupauksista oli euron bensiini suomalaisille autoilijoille. Ei ole näkynyt. Jopa vasemmis
      Maailman menoa
      45
      2868
    6. Tulipalo rivitalossa, tuhoutuu täysin

      Kainuun pelastuslaitos sai hieman puolenyön jälkeen maanantaina ilmoituksen rivitalon huoneistossa syttyneestä tulipalos
      Puolanka
      53
      2346
    7. Miksi Kuhmolaiset on niin nyrpeä ilmeisiä?

      Miksi suurin osa (ei onneksi kaikki) on niin typääntyneen näkösiä elämäänsä? Tuijotetaan toisia pahansuopaisesti ja kat
      Kuhmo
      13
      2337
    8. Kyllä, maata ei halua puolustaa nimenomaan punavihreän puolen edustajat

      "Esimerkiksi maanpuolustushenki on keskimääräistä alempana naisten, arvoliberaalien, heikossa taloustilanteessa olevien
      Maailman menoa
      74
      2223
    9. En selvinnyt ilman naarmuja

      Vaikka ehkä kuvittelin sen olevan ilmoitusluonteinen asia, jonka jälkeen kaikki palaa entiselleen ja ilma puhdistuu. Naa
      Ikävä
      13
      2045
    10. Totuus sattui demareihin, vaativat asiallisen jutun poistoon

      ja oli vielä suosittu, mutta kun demarit tarpeeksi valittivat, niin poistettiin. Raukkamaista toimintaa. Eli siis juttu
      Maailman menoa
      56
      2039
    Aihe