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

scooter2

Benutzer
Beiträge
7
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
 
Werbung:
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.
 
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)
 
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;
 
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
 
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
 
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.
 
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:
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.
 
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?
 
Werbung:
Zurück
Oben