1

次のことを行う after insert トリガーを追加したいと思います。

最初の IF 条件は正常に機能しますが、2 番目になるとすべてが停止します。

何か案は?

USE `Syslog`;
DELIMITER $$

CREATE TRIGGER `SystemEventsR_AINS` AFTER INSERT ON SystemEventsR FOR EACH ROW

IF 
(exists
(select syslogtag from SystemEventsRcounter where syslogtag=
new.syslogtag) 

AND

(select simpledate from SystemEventsRcounter
where syslogtag=new.syslogtag)=new.simpledate) 

THEN
UPDATE SystemEventsRcounter 
SET records=records+1
WHERE SystemEventsRcounter.syslogtag=new.syslogtag;

ELSE INSERT SystemEventsRcounter (simpledate, syslogtag, records) values (new.simpledate,new.syslogtag,1);
END IF
4

1 に答える 1

1

更新:

必要なのはINSERT INTO ... ON DUPLICATE KEY.

CREATE TRIGGER `SystemEventsR_AINS` 
AFTER INSERT ON SystemEventsR 
FOR EACH ROW
    INSERT INTO SystemEventsRcounter (simpledate, syslogtag, records) 
    VALUES (NEW.simpledate, NEW.syslogtag, 1)
    ON DUPLICATE KEY UPDATE records = records + 1;

それが機能するためには、(simpledate, syslogtag) に一意の複合インデックスを作成する必要があります

CREATE UNIQUE INDEX idx_u_simpledate_syslogtag
ON SystemEventsRcounter (simpledate, syslogtag);

これがSQLFiddle のデモです。

あなたがそれをあなたのやり方で望んでいたなら、それは次のように見えるかもしれません

DELIMITER $$
CREATE TRIGGER `SystemEventsR_AINS` 
AFTER INSERT ON SystemEventsR 
FOR EACH ROW
BEGIN
    IF ( 
          SELECT COUNT(*) simpledate 
            FROM SystemEventsRcounter 
           WHERE syslogtag  = NEW.syslogtag
             AND simpledate = NEW.simpledate
       ) > 0 THEN
        UPDATE SystemEventsRcounter 
           SET records = records + 1
        WHERE SystemEventsRcounter.syslogtag = NEW.syslogtag;
    ELSE 
        INSERT INTO SystemEventsRcounter (simpledate, syslogtag, records) 
        VALUES (NEW.simpledate, NEW.syslogtag, 1);
    END IF;
END$$
DELIMITER ;

これがSQLFiddle のデモです。

于 2013-06-26T08:29:17.163 に答える