【问题标题】:mysql trigger error with 2 conditionsmysql触发错误有2个条件
【发布时间】:2013-06-23 06:31:42
【问题描述】:

我想添加一个插入后触发器,它将执行以下操作。

第一个 IF 条件正常工作,但当涉及到第二个时,一切都停止了。

有什么想法吗?

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

【问题讨论】:

    标签: mysql triggers conditional-statements


    【解决方案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 演示。

    【讨论】:

    • 它仍然无法正常工作..我正在尝试找出它是否是逻辑错误而不是语法错误,还是谢谢你
    • 我没有收到任何错误,但触发器停止了。当我省略第二个条件(简单日期的事情)时,一切都很好。
    • 这就像连接两个条件的 AND 正在发生的事情。是否存在 MySQL 不理解 IF 语句中的 AND 的情况?
    • 有时,当您过分关注某个问题时,您会失去全局。实际的问题是我为 syslogtag 创建了一个唯一键,因此无法完成具有相同 syslogtag 但具有不同 simpledate 的新插入。但无论如何,“插入重复键”的解决方案效率更高。再次感谢您,我真的很感激。
    猜你喜欢
    • 2013-11-20
    • 2015-02-28
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2021-01-20
    • 2013-01-08
    相关资源
    最近更新 更多