检查是否在mysql触发器中从select into设置了变量

xmjla07d  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(425)

我不确定是否已经回答了这个问题,但我找不到一个好的解决方案。
我的table有个扳机( source_table ),它将填充另一个表( target_table ). 但是,在填充 target_table ,我需要从另一个表中获取一个值( intermediate_table ). 但我需要 INSERT INTO 我的 target_table 仅当 source_table 可在 intermediate_table .
我现在的触发器是这样的。

DROP TRIGGER IF EXISTS after_source_table_insert;
DELIMITER $$
CREATE TRIGGER after_source_table_insert AFTER INSERT
 ON source_table
 FOR EACH ROW
 BEGIN
    DECLARE my_id INT(11);
    SELECT some_id INTO my_id FROM intermediate_table it WHERE it.some_id = NEW.another_id;
    IF my_id <> NULL THEN -- CONDITION ---
      INSERT INTO `target_table` (`target_id`, `updated_at`)
      VALUES (my_id, NOW())
      ON DUPLICATE KEY UPDATE   `updated_at` = NOW();
    END IF;
 END;
$$

然而 CONDITION 似乎不起作用,即使 my_id 是有效的。
执行任务的最佳方式是什么 INSERT 查询 SELECT 填充 my_id ?
正在使用 select FOUND_ROWS(); 这是个不错的选择?
注意:我不想这样做 SELECT 不止一次因为table很大。

ufj5ltwl

ufj5ltwl1#

NULL 可以使用 IS NULL 或者 IS NOT NULL .
另外,我还设置了 my_idNULL ,以避免意外情况。通常,为声明的变量设置默认值是一种好的做法。
请尝试以下操作:

DECLARE my_id INT(11) DEFAULT NULL;
SELECT some_id INTO my_id FROM intermediate_table it WHERE it.some_id = NEW.another_id;
IF my_id IS NOT NULL THEN -- CONDITION ---
  INSERT INTO `target_table` (`target_id`, `updated_at`)
  VALUES (my_id, NOW())
  ON DUPLICATE KEY UPDATE   `updated_at` = NOW();
END IF;

相关问题