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

Erstellen eines Triggers verursacht fehler - Code von mysql.com.

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

  1. jmar83

    jmar83 Datenbank-Guru

    Hallo zusammen

    Dieser Code ist unter mysql.com zu finden:

    Code:
    CREATE TRIGGER insert_myisam_child
    BEFORE INSERT
    ON myisam_child
    FOR EACH ROW
    BEGIN
    IF (SELECT COUNT(*) FROM myisam_parent WHERE mparent_id=new.mparent_id)=0
    THEN
    INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
    END IF;
    END;

    (https://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html)


    Auf meine Bedürfniusse angepasst sieht er so aus:


    Code:
    CREATE TRIGGER insert_adressen
      BEFORE INSERT
      ON adressen
      FOR EACH ROW
      BEGIN
      
      IF (SELECT COUNT(*) FROM adressen WHERE adr_id=new.adr_id)=0
      THEN
      INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
      END IF;
      
      END;

    Die Tabelle "adressen" und das Feld "adr_id" existiert.

    TRotzdem kommt immer diese Meldung ohne Aussagekraft:

    " #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8 "


    Grüsse, Jan
     
    Zuletzt von einem Moderator bearbeitet: 19 Juli 2015
  2. akretschmer

    akretschmer Datenbank-Guru

    Warum willst Du einen TRIGGER erstellen, der Foreign Keys sicherstellen soll? Warum definierst Du das nicht gleich passend?
     
  3. jmar83

    jmar83 Datenbank-Guru

    Hallo akretschmer
    Ist zwar nicht das Thema, aber ich habe schon meinen Grund, der Problem nennt sich "MyISAM"
    Oder kann ich eine MyISAM-Tabelle nach InnoDB umwandeln?

    Gruss, Jan
     
  4. jmar83

    jmar83 Datenbank-Guru

    Als Frontend verwende ich "HeidiSQL", dabei ist mir aufgefallen dass ich manchmal ein Semikolon setzen muss was normalerweise (?) nicht der Fall ist.
    Hier bei meinem Trigger weiss ich allerdings nicht wo..?
    Nachtrag: in phpmyadmin geht's auch nciht...
    GRüsse, Jan
     
  5. akretschmer

    akretschmer Datenbank-Guru

    insert benötigt meines Wissens ein 'to', ich denke mal, das wird auch in MyZettelkasten so sein. Das Beispiel in der Doku bezieht sich auf 2 Tabellen, Du willst das in einer machen. Und ja, ersetz am Besten nicht nur MyISAM mit was anderen, sondern gleich MySQL mit einer richtigen DB.
     
  6. jmar83

    jmar83 Datenbank-Guru

    Das Problem scheint in diesem Abschnitt zu sein:

    use adressql;
    IF (SELECT COUNT(*) FROM adressen)=0
    SELECT "A"
    END IF;


    Fehler von heidisql:

    /* SQL Fehler (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT COUNT(*) FROM adressen)=0
    SELECT "A"
    END IF' at line 1 */
    /* Affected rows: 0 Gefundene Zeilen: 0 Warnungen: 0 Dauer von 1 of 2 queries: 0,000 sec. */



    Fehler von pma:

    Fehler
    SQL-Befehl: [​IMG]

    IF( SELECT COUNT( * )
    FROM adressen ) =0
    SELECT "A"
    END IF ;

    MySQL meldet: [​IMG]

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT COUNT(*) FROM adressen)=0
    SELECT "A"
    END IF' at line 1
     
  7. jmar83

    jmar83 Datenbank-Guru

    Dieser Befehl geht aber "alleine":

    SELECT COUNT(*) FROM adressen


    ?????

    wie soll ich bitte denn das "if" anders formulieren als auf der mysql-seite angegeben, wtf!!?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    finde den Unterschied!

    Code:
    test=*# select 'A';
     ?column?
    ----------
     A
    (1 row)
    
    test=*# select "A";
    ERROR:  column "A" does not exist
    LINE 1: select "A";
    
     
  9. jmar83

    jmar83 Datenbank-Guru

  10. jmar83

    jmar83 Datenbank-Guru

    nix geht:

    use adressql;
    IF (SELECT COUNT(*) FROM "adressen")=0
    SELECT "A"
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM 'adressen')=0
    SELECT 'A'
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM 'adressen')=0
    SELECT "A"
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM "adressen")=0
    SELECT 'A'
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM `adressen`)=0
    SELECT `A`
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM "adressen")=0
    SELECT `A`
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM 'adressen')=0
    SELECT `A`
    END IF;
     
  11. jmar83

    jmar83 Datenbank-Guru

    auch nix:

    use adressql;
    IF (SELECT COUNT(*) FROM adressen)=0
    SELECT 0
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM "adressen")=0
    SELECT 0
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM 'adressen')=0
    SELECT 0
    END IF;

    use adressql;
    IF (SELECT COUNT(*) FROM `adressen`)=0
    SELECT 0
    END IF;
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select case when 1=1 then 'ja' else 'nein' end as demo;
     demo
    ------
     ja
    (1 row)
    
     
  13. jmar83

    jmar83 Datenbank-Guru

    Ich glaube ich "löse" das Problem auf PHP-Ebene, nur einfügen falls Teilmenge von... da FK un PK in der gleichen Tabelle sind und zusammen einen Tree repräsentieren.

    Der FK darf entweder null sein oder wie gesagt Teilmenge aller PK's sein.
     
  14. jmar83

    jmar83 Datenbank-Guru

    Hat sich erledigt. danke.
     
  15. akretschmer

    akretschmer Datenbank-Guru

    DB-Aufgaben in der Applikation zu lösen ist ein guter und schneller Weg in vielfältige Probleme. Eines Deiner nächsten Probleme wird dann vermutlich die rekursive Abfrage Deines Baumes sein.

    Ich kann Dir nur empfehlen, gleich eine DB zu nehmen, die das alles richtig kann, noch bevor der Beton Deiner Baustelle aushärtet.
     
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