Trigger - AFTER INSERT ON DELETE

JohannaZE

Neuer Benutzer
Beiträge
2
[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);
 
Werbung:
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 :-(
 
Werbung:
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 ;-)
 
Zurück
Oben