2013-04-12 12 views
23

So habe ich zwei Tabellen wie diese ...
MySQL-Trigger auf Insert/Update Ereignisse

ext_words 
------------- 
| id | word | 
------------- 
| 1 | this | 
------------- 
| 2 | that | 
------------- 
| 3 | this | 
------------- 

ext_words_count 
--------------------- 
| id | word | count | 
--------------------- 
| 1 | this | 2 | 
--------------------- 
| 2 | that | 1 | 
--------------------- 

Ich versuche, einen Auslöser zu schaffen, wird:

  • Update ext_words_count.count wenn ext_words.word aktualisiert .

Um die Sache noch komplizierter zu machen,

  • wenn ext_words.word nicht in ext_words_count existiert, wenn ext_words aktualisiert wird, würde ich es in ext_words_count und ich

count als 1 gesetzt einfügen möchten haben sich ähnliche Fragen angeschaut:
1. Before/after insert trigger using auto increment field und
2. Using Trigger to update table in another database
versuchen, den 2. Hier zu kombinieren ist, was ich habe, so weit:

DELIMITER $$ 
CREATE TRIGGER update_count 
AFTER UPDATE ON ext_words 
FOR EACH ROW 
BEGIN 

    UPDATE ext_words_count 
    SET word_count = word_count + 1 
    WHERE word = NEW.word; 

END; 
$$ 
DELIMITER ; 

Jede Beratung und Richtung wird sehr geschätzt. Oder vielleicht eine andere Methode, die ich übersehen habe und wie immer Danke im Voraus!

UPDATE:
I für die Verwendung von 2 Trigger entschieden haben, eine für INSERT und eine für UPDATE, weil ich mit bedingten Anweisungen in MySQL nicht so vertraut bin.

DELIMITER $$ 
CREATE TRIGGER insert_word AFTER INSERT ON ext_words 
    FOR EACH ROW 
    BEGIN 
     INSERT IGNORE INTO ext_words_count (word) VALUES (NEW.word); 
    END; 
$$ 
DELIMITER ; 

und

DELIMITER $$ 
CREATE TRIGGER update_word AFTER UPDATE ON ext_words 
    FOR EACH ROW 
    BEGIN 
     UPDATE ext_words_count 
     SET word_count = word_count + 1 
     WHERE word = NEW.word; 
    END; 
$$ 
DELIMITER ; 

Die INSERT-Abfrage funktioniert großartig, aber die UPDATE-Abfrage ist die Aktualisierung nicht word_count. Gibt es etwas, das ich in der Update-Abfrage verpasst habe ..?

+3

Sie mögen dies, [MySQL Feuer sehen Trigger für sowohl Einfügen als auch Aktualisieren] (http://stackoverflow.com/questions/1318224/mysql-fire-trigger-for-both-insert-and-update) Hat meine Lösung funktioniert? Was für ein Ergebnis möchte ich verbessern? Denken Sie daran, dass Sie die gleiche Tabelle nicht aktualisieren können, auf der Sie Trigger in MySQL aufrufen –

+0

@GrijeshChauhan - Danke für den Link! Ich bin nicht in der Lage, Ihre Antwort zu erhalten, aber das liegt daran, dass ich in bedingungslosen Aussagen in MySQL neu bin, nicht wegen Ihrer Lösung. – Drewness

+0

Ich meine, wenn ext_words aktualisiert wird, wenn das Wort nicht in ext_words_count ist, dann möchte ich es einfügen und die Zählung 1 machen. Andernfalls, wenn das Wort in ext_words_count ist, erhöhen Sie die Anzahl um 1 ... – Drewness

Antwort

36

Mit Grijeshs perfekter Hilfe und seinem Vorschlag, bedingte Anweisungen zu verwenden, konnte ich ONE auslösen, der beide Aufgaben erfüllt. Dank Grijesh wieder

DELIMITER $$ 
CREATE TRIGGER update_count AFTER INSERT ON ext_words 
FOR EACH ROW 
    BEGIN 
    IF NOT EXISTS (SELECT 1 FROM ext_words_count WHERE word = NEW.word) THEN 
     INSERT INTO ext_words_count (word) VALUES (NEW.word); 
    ELSE 
     UPDATE ext_words_count SET word_count = word_count + 1 WHERE word = NEW.word; 
    END IF; 
    END $$  
DELIMITER; 
+0

nice Also, welches Formular hat dir DB.exchange geholfen? –

+1

Nie von irgendjemandem gehört. :(Ich habe gerade einige Artikel durchgeblättert. Nochmals vielen Dank für Ihre Hilfe und auf die andere Seite! – Drewness

+1

Dieser Trigger funktioniert fantastisch in meinem MySQL-Server, um überflüssige Einfügungen herauszufiltern. – Kiwi

3

vermeiden Verwendung von Schlüsselwörtern wie Zahl als von der SQL-Methode verwendet wird einige Zeit, um seine Fehler erstellen, aber einige Läufe gut

DELIMITER $$ 
CREATE TRIGGER update_count 
    AFTER UPDATE ON ext_words 
    FOR EACH ROW 
     BEGIN 

      SELECT count INTO @x FROM ext_words_count LIMIT 1; 
      UPDATE ext_words_count 
      SET count = @x + 1 
      WHERE word = NEW.word; 

END; 
$$ 
DELIMITER ;