【问题标题】:SQL-Trigger: Create row if row doesn't existSQL-Trigger:如果行不存在则创建行
【发布时间】:2018-03-27 00:42:38
【问题描述】:

我正在尝试创建一个触发器,该触发器在插入时更新另一个表中的行。最后一部分有效,但如果没有具有该 id 的行,我想在添加之前为该 id 创建一行。

但我收到 #1064 错误:'resource_xpEvents FOR EACH ROW 开始 如果不存在(从 resource_xp 中选择 1 '

DELIMITER $$
CREATE TRIGGER test AFTER INSERT resource_xpEvents FOR EACH ROW
BEGIN
IF NOT EXISTS (SELECT 1 FROM resource_xp WHERE userId = NEW.userId) THEN
    INSERT INTO resource_xp (userId)
    VALUES (NEW.userId);
END IF;

UPDATE resource_xp
    SET xp = xp + new.delta
    WHERE userId = new.userId

END $$
DELIMITER ;

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    试试这个:

    DELIMITER $$
    CREATE TRIGGER test AFTER INSERT ON resource_xpEvents FOR EACH ROW
    BEGIN
    IF NOT EXISTS (SELECT 1 FROM resource_xp WHERE userId = NEW.userId) THEN
        INSERT INTO resource_xp (userId)
        VALUES (NEW.userId);
    END IF;
    
    UPDATE resource_xp
        SET xp = xp + new.delta
        WHERE userId = new.userId;
    
    END $$
    DELIMITER ;
    

    如果你想尝试:

    DELIMITER $$
    CREATE TRIGGER test AFTER INSERT ON resource_xpEvents FOR EACH ROW
    BEGIN
    
        REPLACE INTO resource_xp (userId,xp) values (NEW.userId,xp+new.delta);
    
    END $$
    DELIMITER ;
    

    可读性更强,但性能更差。

    【讨论】:

    • 您在尝试安装触发器时遇到错误?
    • 我的错。另一个错误:第 12 行“END”处的语法错误
    • 因为你缺少一个 ;在更新语句的末尾。
    • 这个问题是一个UPSERT,MySQL有比这个答案更好的处理方法。
    【解决方案2】:

    您可以在此处尝试使用 MySQL 的 INSERT ... ON DUPLICATE KEY UPDATE 语法。首先,如果userId 列还不是唯一的,则使其唯一:

    ALTER TABLE resource_xp ADD CONSTRAINT UNIQUE (userId);
    

    然后,不要尝试执行单独的条件插入和更新语句,只需执行以下单个语句:

    INSERT INTO resource_xp (userId)
    VALUES (NEW.userId)
    ON DUPLICATE KEY UPDATE xp = xp + NEW.delta
    

    这里是完整建议触发器的代码:

    DELIMITER $$
    CREATE TRIGGER test AFTER INSERT resource_xpEvents FOR EACH ROW
    BEGIN
        INSERT INTO resource_xp (userId)
        VALUES (NEW.userId)
        ON DUPLICATE KEY UPDATE xp = xp + NEW.delta
    END $$
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2023-03-21
      • 2017-07-19
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多