TRIGGER: Foreign Key SET NULL ON DELETE geht nicht

jmar83

SQL-Guru
Beiträge
146
Hallo zusammen
Ich bin gerade dran einen Trigger zu erstellen welcher u.A. den Foreign Key auf NULL sezten soll falls ein Datensatz mit dem entspr. Primary Key gelöscht wird.

Die Tabelle repräsentiert eine Baumstruktur, Primary Key und Foreign Key beschränken sich also auf 1 Tabelle!

Feldname Primary Key: adr_id
Feldname Foreign Key: NodeOf




DROP TRIGGER IF EXISTS adressql.t_adressen_delete;

CREATE TRIGGER t_adressen_delete
BEFORE DELETE
ON adressen
FOR EACH ROW
BEGIN
UPDATE adressen SET NodeOf = NULL WHERE NodeOf = OLD.adr_id;
END$$



...Leider erhalte ich diese Fehlermeldung:
Unbenannt.jpg


Ich frage mich, was an meinem Code falsch ist?

Der Trigger ist BEFORE DELETE, und überall wo der zu löschende Datensatz (OLD.adr_id) ein Foreign Key ist (im Feld "NodeOf") soll auf NULL gesetzt werden. Ich sehe leider nicht, wo der Fehler liegt.

Kann mir jemand helfen? (So nebenbei: Ich verwende das nicht grundlos) Besten Dank im Voraus!



Grüsse, Jan
 
Werbung:
Nein ein "CASCASE DELETE" analog dem SQL Server ist nicht der Fall. Des weiteren ist das Feld gar kein "richtiger" Foreign Key, sondern ein "normales" UNSIGNED IN TFeld (ALLOW NULL) welchem über Trigger eine Foreign-Key-Funktionalität quasi aufgezwungen wird (INSERT und UPDATE gehen bereits, nun kommt noch DELETE dran), na ja...
 
Einer Tabelle einen Trigger zu hinterlegen und dort drin die Tabelle selbst editieren geht scheinbar bei MySQL nicht. (Fehler 1442)
 
Einer Tabelle einen Trigger zu hinterlegen und dort drin die Tabelle selbst editieren geht scheinbar bei MySQL nicht. (Fehler 1442)

Code:
kein Problem in PG:

[code]
test=# select * from x;
 adr_id | nodeof
--------+--------
  1 |
  2 |  1
(2 rows)

Time: 0,279 ms
test=*# create or replace function del_nodeof() returns trigger as $$ begin update x set nodeof = null where nodeof = old.adr_id; return new;end; $$language plpgsql;
CREATE FUNCTION
Time: 0,339 ms
test=*# \d x
  Table "public.x"
 Column |  Type  | Modifiers
--------+---------+-----------
 adr_id | integer | not null
 nodeof | integer |
Indexes:
  "x_pkey" PRIMARY KEY, btree (adr_id)
Foreign-key constraints:
  "x_nodeof_fkey" FOREIGN KEY (nodeof) REFERENCES x(adr_id)
Referenced by:
  TABLE "x" CONSTRAINT "x_nodeof_fkey" FOREIGN KEY (nodeof) REFERENCES x(adr_id)
Triggers:
  trg1 BEFORE DELETE ON x FOR EACH ROW EXECUTE PROCEDURE del_nodeof()

test=*# delete from x where adr_id = 1;
DELETE 0
Time: 0,422 ms
test=*# select * from x;
 adr_id | nodeof
--------+--------
  1 |
  2 |
(2 rows)

Time: 0,173 ms
 
Was ist PG? Wurde schon das letzte Mal nicht wirklich schlau aus Deinem Code! ;-)

Nun habe ich das Problem "restrict"-mässig gelöst, also verweigern zu löschen falls noch was vorhanden ist.

Dazu später eine SP, welche die FK's "nullt"...
 
PG = Postgres? Zur Zeit leider kein Bedarf. ("
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
")

Aber trotzdem Danke für die Nachfrage!


Gruss, Jan
 
Werbung:
Zurück
Oben