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: Foreign Key SET NULL ON DELETE geht nicht

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jmar83, 26 Juli 2015.

  1. jmar83

    jmar83 Datenbank-Guru

    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: [​IMG]

    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
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Kaskadiert dein FK? Wenn ja, liegt da der Fehler :)
     
  3. jmar83

    jmar83 Datenbank-Guru

    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...
     
  4. jmar83

    jmar83 Datenbank-Guru

  5. jmar83

    jmar83 Datenbank-Guru

    Nicht mal das geht, gleiche Fehlermeldung:

    UPDATE adressen SET NodeOf = NULL;

    Grüsse, Jan
     
  6. jmar83

    jmar83 Datenbank-Guru

    Einer Tabelle einen Trigger zu hinterlegen und dort drin die Tabelle selbst editieren geht scheinbar bei MySQL nicht. (Fehler 1442)
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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
    
     
  8. jmar83

    jmar83 Datenbank-Guru

    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"...
     
  9. jmar83

    jmar83 Datenbank-Guru

    PG = Postgres? Zur Zeit leider kein Bedarf. ("
    Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
    ")

    Aber trotzdem Danke für die Nachfrage!


    Gruss, Jan
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ja. Ist halt eine richtige und funktionierende DB. Aber daran hast ja keinen Bedarf.
     
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