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

phpMyadmin einrichten das nach ins o. update Prozedur ausgeführt wird

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von scooter2, 15 April 2016.

  1. scooter2

    scooter2 Benutzer

    Hallo,

    ich habe folgende Zeile in mysql erfolgreich erstellt

    UPDATE `phone_number` SET name = REPLACE(name,' ' , '' )

    Damit nehme ich die Leerzeichen aus der Spalte der Telefonummer.
    Ich weiß nicht wo ich den Befehl eintragen muss im PHPmyadmin damit dieser nach update oder insert autom. ausgeführt wird. Kann mir da jemand helfen
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du suchst einen TRIGGER, und dieser muß in der DB sein, nicht in PMA. Das freundliche Handbuch zu MySL erklärt Dir, wie ein TRIGGER definiert wird.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Demo in PostgreSQL

    Code:
    test=*# create table telefon(nummer text);
    CREATE TABLE
    test=*# create or replace function clean_nummer() returns trigger as $$begin new.nummer:=regexp_replace(new.nummer,' ','','g'); return new; end;$$language plpgsql;
    CREATE FUNCTION
    test=*# create trigger trg1 before insert or update on telefon for each row execute procedure clean_nummer();
    CREATE TRIGGER
    test=*# insert into telefon values ('  123 456 789  10  ');
    INSERT 0 1
    test=*# select nummer, 'XXX' || nummer || 'yyy' from telefon;
      nummer  |  ?column?   
    -------------+-------------------
     12345678910 | XXX12345678910yyy
    (1 row)
    
     
  4. scooter2

    scooter2 Benutzer

    Ja, dieser Link führt mich dann ins Wiki
    und ich weiß immer nicht ob ich mit meiner Annahme richtig liege


    CREATE TRIGGER phone_book_example
    AFTER UPDATE ON phone_number
    BEGIN
    UPDATE `phone_number` SET name = REPLACE(name,' ' , '' )
    END;
     
  5. akretschmer

    akretschmer Datenbank-Guru

    ich benutze kein MySQL, vielleicht findet sich hier jemand, der das prüfen kann. Obige Demo funktioniert - aber mit PostgreSQL.

    Mir scheint das aber an sich falsch. Ein 'after' - Trigger kann nichts mehr ändern, und in einem Update-Trigger wieder ein Update aufzurufen ist wie:

    Rekursion: -> siehe Rekursion
     
  6. scooter2

    scooter2 Benutzer

    Naja wenn ein User eine Nummer kopiert und einträgt ist es ein update auf den Adress Satz. Danach soll jedoch der autom. Trigger laufen damit die Leerzeichen entfernt werden.
    Trotzdem Danke für deine Zeit
     
  7. ukulele

    ukulele Datenbank-Guru

    Also zur Syntax kann ich auch nichts sicher sagen.

    Neben Update wirst du sicher auch Insert abdecken wollen, das kann man häufig im selben Trigger mit angeben.

    Es geht sowohl mit INSTEAD Triggern als auch mit AFTER Triggern. Bei ersterem musst du für das INSERT bzw. das UPDATE ein komplett eigenes Statement schreiben. In dem wäre dann dein replace() mit eingebaut. Letzteres ist einfacher weil weniger Code (ähnlich deinem jetzigen), verursacht so aber Rekursion. Das kann man verhindern, ist aber wieder ziemlich gefummel.

    Abgesehen davon aktualisierst du jedes mal alle Datensätze der Tabelle, nicht nur das was als letztes eingefügt oder verändert wurde. Schneller geht es, wenn du nur aktualisierst was auch geändert wird. Daher rate ich einfach mal zur INSTEAD OF Variante.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Instead macht halt was anderes, nur kein Update oder Insert, und ein After-Trigger kann nicht mehr auf NEW.* zugreifen.
     
  9. scooter2

    scooter2 Benutzer

    Danke für die Antwort. Wenn ich mein Update mit meiner Funktion laufen lasse dauert es 0,5 sec bei 336.000 Einträgen. Da ist vermschmerzbar. Aber was ist wenn 10.000 Datensätze importiert werden vs einzelne geändert oder eingefügt.
     
    Zuletzt bearbeitet: 15 April 2016
  10. akretschmer

    akretschmer Datenbank-Guru

    ich weiß nicht, was du vorhast. Die ganze Tabelle updaten oder nur einen Trigger machen? Ich weiß nicht, ob MySQL conditionelle Trigger kann:

    Code:
    test=*# create trigger trg1 before insert or update on telefon for each row when (new.nummer ~ ' ') execute procedure clean_nummer();
    CREATE TRIGGER
    
    dieser würde nur feuern, wenn der Check auf das Vorhandensin von Leerzeichen positiv ist.
     
  11. scooter2

    scooter2 Benutzer

    Da alle darin befindlichen alten Einträge korrekt sind macht es Sinn die neuen vor dem Eintrgen zu korrigieren.

    CREATE TRIGGER phone_number
    trg1 before insert or update on telefon for each row when (new.name ~ ' ') execute procedure = REPLACE(name,' ' , '' )
    END;

    so etwa?
     
  12. akretschmer

    akretschmer Datenbank-Guru

    vermutlich so etwa. Wie gesagt: ich arbeite nicht mit MySQL. Aus gutem Grund.
     
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