2010-07-02 33 views
9

Ho una domanda semplice. Ive ha ottenuto un trigger per inserire i valori in un altro databaseTrigger su INSERT ON DUPLICATE KEY

Così, per esempio, se ci sono due valori e il grilletto sta controllando il valore in Table A e l'inserimento in Table B

ecco il codice

-- Trigger DDL Statements 
USE `db`; 
DELIMITER // 

CREATE 
DEFINER=CURRENT_USER() 
TRIGGER `db`.`AFTER_INSERT_A` 
AFTER INSERT ON `db`.`a` 
FOR EACH ROW 
BEGIN 

    IF NEW.val!= NULL 
    THEN 

     UPDATE b SET dateRemove=CURRENT_TIMESTAMP WHERE val=NEW.val; 

     INSERT INTO b (val) VALUES(NEW.val) ON DUPLICATE KEY UPDATE dateRemove=NULL, dateUpdate=CURRENT_TIMESTAMP; 

    END IF; 
END// 

Il dosatore di trigger genera persino errori. E non ho valori in B

mio inserimento è

INSERT INTO a (val) VALUES(`test`) ON DUPLICATE KEY UPDATE dateUpdate=CURRENT_TIMESTAMP 

Ha uno ha qualche idea. Ho provato a creare due trigger uno INSERT e l'altro UPDATE, Ive ha cambiato il AFTER a BEFORE e il mio tavolo b non ha ancora ottenuto nulla. Tutte le idee grazie in anticipo

+0

Grande domanda, e diventare un vecchio. Quindi, cosa succede se si desidera ottenere sia OLD.val e NEW.val mentre si trova all'interno del trigger? –

risposta

10

il grilletto per essere eseguito su una query come

INSERT INTO table (x, y, z) VALUES('x', 'y', 'z') ON DUPLICATE KEY UPDATE x=VALUES(x); 

deve sempre essere eseguito su un trigger BEFORE INSERT.

+2

So che questo è vecchio, ma hai una prova che questo è vero? – jcoffland

2

Forse invece di

NEW.val!= NULL 

è necessario

NEW.val IS NOT NULL 

Un valore non è mai uguale a nulla, e non è mai uguale a null.

+0

Ci scusiamo per la risposta tardiva, proverò questo e pubblicherò un aggiornamento –

+0

no, non ci sono inserti nella tabella B –

Problemi correlati