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: benötige Hilfe

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von RyoFF, 28 Mai 2013.

  1. RyoFF

    RyoFF Benutzer

    Hallo, ich muss einen Trigger in MySQL erstellen.
    Meine XAMPP Version ist 1.8.1.. PHPMyAdmin ist 3.5.2.2.

    die relevanten Tabellen sind:

    posts:
    p_id
    category_id
    topic_id
    post_creator
    post_content
    post_date

    topics:
    t_id
    category_id
    topic_title
    topic_creator
    topic_last_user
    topic_date
    topic_reply_date
    topic_views


    Nun möchte ich, dass wenn ich in der Datenbank einen neuen Post hinzufüge, dass im topics topic_reply_date automatisch gesetzt wird.

    mein code ist:

    Code:
    BEGIN
    UPDATE topics SET topic_reply_date=NOW(), topic_last_user=(SELECT 'post_creator' FROM 'posts' WHERE 'p_id' = '0')
    WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 't_id' = '0') ;
     
    END
    ich erhalte aber die folgende Fehlermeldung:

    Code:
    #1064: You have an error in your SQL Syntax; check the manaual that corresponds to your MySQL server versionfor the right syntax to use near "(SELECT 'post_creator' FROM 'posts' WHERE 'id' = '0') WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 'id' = '0')" at line 2.
    ich komme nicht darauf, was am code falsch sein kann und ob ic evtl. was kleiner oder sogar großes übersehe.

    vielen dank schon mal im voraus.
    RyoFF
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Aus dem Bauch heraus würde ich sagen, Du solltest im TRIGGER nicht nochmals ein SELECT auf die auslösende Tabelle machen, um aus dieser z.B. den post_creator zu frickeln. Zumindest in PostgreSQL hat man NEW, welches alle Felder des neuen Records enthält. Ich vermisse auch die Definition des TRIGGERs selbst.

    Aber - ich kann mich irren. Mit MySQL spiele ich nicht.
     
    RyoFF gefällt das.
  3. RyoFF

    RyoFF Benutzer


    Code:
    -- Full Trigger DDL Statements
    -- Note: Only CREATE TRIGGER statements are allowed
    DELIMITER $$
     
    USE `alf`$$
     
    CREATE
    DEFINER=`root`@`localhost`
    TRIGGER `alf`.`update_last_reply_user`
    AFTER INSERT ON `alf`.`posts`
    FOR EACH ROW
    BEGIN
    UPDATE topics SET topic_reply_date=NOW(), topic_last_user=(SELECT 'post_creator' FROM 'posts' WHERE 'p_id' = '') 
                           WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 't_id' = '') ;
    
                        END
     
    
     
  4. RyoFF

    RyoFF Benutzer

    Während das eine Problem noch nicht gelöst wurde, habe ich ein Weiteres.
    Und zwar möchte ich eine Funktion mit MySQL erstellen.
    Und zwar habe ich in der Tabelle 'users' ein Feld 'aktiv'. Hier befindet sich entweder der Wert 'NULL' oder ein generierter md5-Code.

    Nun möchte ich mit der Funktion alle Benutzer anzeigen lassen die nicht den Wert 'NULL' haben.

    users:
    u_id
    username
    password
    email
    vorname
    nachname
    aktiv

    Ich hätte gedacht, dass sollte reichen, allerdings wird das nicht angenommen. Vielleicht hat hjemand parallel zum anderen Problem hier auch noch jemand eine Hilfe parat :)
    Code:
    BEGIN
      SELECT 'username' FROM users WHERE aktiv = '!NULL';
      END
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Vergleiche auf NULL nicht mit = sondern mit is null

    Code:
    test=*# create table ryoff (id int, value int);
    CREATE TABLE
    test=*# insert into ryoff values (1,0);
    INSERT 0 1
    test=*# insert into ryoff values (2,NULL);
    INSERT 0 1
    test=*# insert into ryoff values (3,1);
    INSERT 0 1
    test=*# select * from ryoff where value = NULL;
     id | value
    ----+-------
    (0 rows)
    
    test=*# select * from ryoff where value is NULL;
     id | value
    ----+-------
      2 |
    (1 row)
    
    test=*# select * from ryoff where value is not NULL;
     id | value
    ----+-------
      1 |     0
      3 |     1
    (2 rows)
    
    Grundlagen, btw ;-)
     
    RyoFF gefällt das.
  6. RyoFF

    RyoFF Benutzer

    Fehler entdeckt.
    die ' ' waren überall falsch..
     
  7. RyoFF

    RyoFF Benutzer

    Hi,
    vielen Dank dir schon mal für die Hilfe.
    Also ich wollte gerne eine Routine erstellen/speichern. Eine Funktion, die ich immer wieder ausführen kann.
    Wie bereits kurz erwähnt, möchte ich zählen, wieviele USER aktiv (also das Feld mit NULL gefüllt ist.)

    Mein code dazu ist -->

    Code:
    DELIMITER $$
    CREATE FUNCTION active_users()
    RETURNS INT
     
    DECLARE users_count INT;
    BEGIN
    SELECT COUNT(*) INTO users_count FROM users WHERE aktiv is NULL;
    RETURN(users_count);
    END
    $$
    DELIMITER ;
    
    Hast jemand einen Tipp für mich, was an dem Code falsch sein kann? Workbench markiert DECLARE als falsch. Aber evtl ist das nicht der einzige Fehler. Und wenn doch, was kann ich statt DECLARE verwenden?

    Viele Grüße
    RyoFF
     
  8. akretschmer

    akretschmer Datenbank-Guru


    Google, 2 Sekunden, findet man Beispiele für Funktionen mit MySQL: http://sql-info.de/mysql/examples/create-function-examples.html . Da kommt das DECLARE erst nach dem BEGIN.
     
    RyoFF gefällt das.
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