检查是不是从 MySQL 触发器中的 SELECT INTO 设置了变量

Posted

技术标签:

【中文标题】检查是不是从 MySQL 触发器中的 SELECT INTO 设置了变量【英文标题】:Check if a variable was set from SELECT INTO in MySQL Triggers检查是否从 MySQL 触发器中的 SELECT INTO 设置了变量 【发布时间】:2018-10-04 13:12:32 【问题描述】:

我不确定这是否已经得到解答,但我找不到好的解决方案。

我的表 (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 有效。

如果SELECT 填充my_id,执行INSERT 查询的最佳方式是什么?

在这里使用select FOUND_ROWS(); 是一个不错的选择吗?

注意:我不想重复SELECT,因为表格很大。

【问题讨论】:

【参考方案1】: 可以使用 IS NULLIS NOT NULL 比较 NULL 值。 另外,我已将my_id 的默认值设置为NULL,以避免出现意外情况。为声明的变量设置默认值通常是一种很好的做法。

尝试以下方法:

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;

【讨论】:

@PraneethPeiris 乐于提供帮助:) 刚刚接受了你的回答,它要求我等待 10 分钟才能接受(出于某种原因)。

以上是关于检查是不是从 MySQL 触发器中的 SELECT INTO 设置了变量的主要内容,如果未能解决你的问题,请参考以下文章

MySQL触发器检查行字段是不是存在

MySQL查看检查数据是不是为NULL

MySQL 触发器在插入后检查是不是没有重复然后运行 ​​sys_exec udf

在插入表之前检查数据是不是存在

mysql如何查看表中的所有约束和触发器?

如何检查 MySQL php 中的列是不是为空?