Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Trigger - AFTER INSERT ON DELETE

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von JohannaZE, 24 Januar 2018.

  1. JohannaZE

    JohannaZE Neuer Benutzer

    [MySQL] FreundschaftEnde-Trigger - Pastebin.com

    Leider bekomme ich es nicht hin Reihen aus Tabellen nach dem INSERT zu löschen. Im Pastebin ist ein funktionierendes Beispiel für DB2 und ich würde mich freuen, wenn Ihr mir helfen würdet es auch in MYSQL umzusetzen.

    Code:
    CREATE TABLE Follows (
        follower VARCHAR(20) NOT NULL,
        followed VARCHAR(20) NOT NULL,
        PRIMARY KEY (follower, followed),
        FOREIGN KEY (follower) REFERENCES User(username) ON DELETE CASCADE,
        FOREIGN KEY (followed) REFERENCES User(username) ON DELETE CASCADE
    );
    CREATE TABLE Blocks (
        blocker VARCHAR(20) NOT NULL,
        blocked VARCHAR(20) NOT NULL,
        PRIMARY KEY (blocker, blocked),
        FOREIGN KEY (blocker) REFERENCES User(username) ON DELETE CASCADE,
        FOREIGN KEY (blocked) REFERENCES User(username) ON DELETE CASCADE
    );
    -- Trigger zum löschen der Freundschaft
    CREATE TRIGGER FreundschaftEnde
    AFTER INSERT ON blocks
    FOR EACH ROW
    BEGIN
    DELETE FROM Follows
    -- Hier sollen nun alle Reihen gelöscht werden, welche für eine Freundschaft stehen.
    -- Wie im funktionierenden Beispiel unten. Mein Problem, wie spreche ich nun die neu.blocker und f.follower bzw. f.followed an?
    -- Ich muss einmal die Richtung follower followed löschen und andersrum.
    END;
      
    -- In DB2 wie folgt gelöst
    CREATE TRIGGER FreundschaftEnde
    AFTER INSERT ON blocks
    REFERENCING NEW AS neu
    FOR EACH ROW MODE DB2SQL
    DELETE FROM Follows f
    WHERE (neu.blocker = f.follower AND neu.blocked = f.followed)
    OR (neu.blocked= f.follower AND neu.blocker = f.followed);
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Hrm. Syntax ist fast wie in PostgreSQL, interessant ;-)

    Aber mit MySQL kann ich Dir nicht helfen, sorry.
     
  3. JohannaZE

    JohannaZE Neuer Benutzer

    Kein Thema eventuell könntest du mir sagen wie du in PostgreSQL das ansprechen würdest? Eventuell macht es dann Klick bei mir :) Mein Problem liegt ja wirklich im ansprechen der Zeilen meine Versuche bis jetzt waren leider erfolglos :-(
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Code:
    create table users(
      username text primary key
    );
    
    CREATE TABLE Follows (
      follower VARCHAR(20) NOT NULL,
      followed VARCHAR(20) NOT NULL,
      PRIMARY KEY (follower, followed),
      FOREIGN KEY (follower) REFERENCES Users(username) ON DELETE CASCADE,
      FOREIGN KEY (followed) REFERENCES Users(username) ON DELETE CASCADE
    );
    CREATE TABLE Blocks (
      blocker VARCHAR(20) NOT NULL,
      blocked VARCHAR(20) NOT NULL,
      PRIMARY KEY (blocker, blocked),
      FOREIGN KEY (blocker) REFERENCES Users(username) ON DELETE CASCADE,
      FOREIGN KEY (blocked) REFERENCES Users(username) ON DELETE CASCADE
    );
    
    create function  FreundschaftEnde() returns trigger as
    $$
      begin
      delete from Follows f where (new.blocker = f.follower AND new.blocked = f.followed)
      OR (new.blocked= f.follower AND new.blocker = f.followed);
      return new;
      end;
    $$ language plpgsql;
    
    create trigger trg1 after insert on blocks for each row execute procedure FreundschaftEnde();
    
    Dann habe ich dies getan:

    Code:
    test=*# insert into users values ('u1');
    INSERT 0 1
    test=*# insert into users values ('u2');
    INSERT 0 1
    test=*# insert into users values ('u3');
    INSERT 0 1
    test=*# insert into users values ('u4');
    INSERT 0 1
    test=*# insert into follows values ('u1','u2');
    INSERT 0 1
    test=*# insert into follows values ('u3','u4');
    INSERT 0 1
    test=*# select * from follows ;
     follower | followed
    ----------+----------
     u1  | u2
     u3  | u4
    (2 rows)
    
    test=*# insert into blocks values ('u1','u2');
    INSERT 0 1
    test=*# select * from follows ;
     follower | followed
    ----------+----------
     u3  | u4
    (1 row)
    
    test=*#
    
    Achtung: ich habe new verwended, nicht neu. Das "REFERENCING NEW AS neu" habe ich erst später gesehen, und auch nicht probiert. Kann aber PG auch, wie ich grad sehe:


    Code:
    test=*# \h create trigger
    Command:  CREATE TRIGGER
    Description: define a new trigger
    Syntax:
    CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
      ON table_name
      [ FROM referenced_table_name ]
      [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
      [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
      [ FOR [ EACH ] { ROW | STATEMENT } ]
      [ WHEN ( condition ) ]
      EXECUTE PROCEDURE function_name ( arguments )
    
    where event can be one of:
    
      INSERT
      UPDATE [ OF column_name [, ... ] ]
      DELETE
      TRUNCATE
    
    test=*#
    
    Das ist der Part, wo ich was gelernt habe ;-)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden