2013-04-12 14 views
23

Così ho due tabelle come questo ...
MySQL Trigger su eventi di inserimento/aggiornamento

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

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

Sto cercando di creare un trigger che verrà:

  • aggiornamento ext_words_count.count quando ext_words.word è aggiornato .

A complicare ulteriormente le cose,

  • se ext_words.word non esiste in ext_words_count quando ext_words è aggiornato, mi piacerebbe inserirlo nel ext_words_count e impostare count come 1.

I ho visto domande simili:
1. Before/after insert trigger using auto increment field e
2. Using Trigger to update table in another database
cercando di coniugare l'2. Ecco quello che ho finora:

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 ; 

Qualche consiglio e la direzione è molto apprezzato. O forse un altro metodo che ho trascurato e come sempre grazie in anticipo!

UPDATE:
ho optato per l'utilizzo di 2 trigger, uno per INSERT e uno per UPDATE perché io non sono che la familiarità con istruzioni condizionali in MySQL.

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 ; 

e

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 ; 

La query INSERT sta lavorando molto, però la query di aggiornamento non viene aggiornato word_count. C'è qualcosa che ho perso nella query di aggiornamento ..?

+3

come si può vedere questo, [MySQL Fuoco Trigger sia per Insert che per Update] (http://stackoverflow.com/questions/1318224/mysql-fire-trigger-for-both-insert-and-update) La mia soluzione ha funzionato? Qual è stato il risultato che vorrei migliorare. Ricorda che non è possibile aggiornare la stessa tabella su cui si chiama trigger in MySQL –

+0

@GrijeshChauhan - Grazie per il collegamento! Non sono in grado di far funzionare la tua risposta, ma è perché sono nuovo alle dichiarazioni condizionali in MySQL, non a causa della tua soluzione. – Drewness

+0

Voglio dire che quando ext_words è aggiornato, se la parola non è in ext_words_count allora voglio inserirla e fare il conteggio 1. Altrimenti se la parola è in ext_words_count, aumenta il conteggio di 1 ... – Drewness

risposta

36

Con l'aiuto perfetto di Grijesh e il suo suggerimento di utilizzare istruzioni condizionali, sono riuscito a ottenere il trigger ONE che esegue entrambe le attività. Grazie ancora Grijesh

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 Quindi quale modulo ti ha aiutato DB.exchange? –

+1

Mai sentito da nessuno. :(Stavo solo sfogliando alcuni articoli. Grazie ancora per tutto il tuo aiuto e indicandomi all'altro sito! – Drewness

+1

Questo trigger funziona in modo fantastico nel mio server MySQL per filtrare gli inserti ridondanti. – Kiwi

3

Evitare l'uso di parole chiave come conta come viene utilizzato con il metodo SQL po 'di tempo la sua creazione di errore, ma alcune piste buone

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 ; 
Problemi correlati