检查是不是从 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 NULL
或 IS 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 设置了变量的主要内容,如果未能解决你的问题,请参考以下文章