首页 > 解决方案 > 在 MySQL 5.6 中使用触发器每次插入目标表后,将一列从源表拉到另一个表

问题描述

嗨,我有两个表实验和结果。我想创建一个触发器,这样每当我在 Result 表中插入一行时,它应该拉取“Experiment”表中存在的最新“Experiment_Name”并拉入名为“Experiment_Name”的“Result”表的列中。

EXPERIMENT TABLE
Experiment_id(auto_incremented)  Exp_name
1                                  abc

RESULT TABLE
Result_id   Exp_Name       Exp_id
1              abc            1                   
2              abc            1
3              abc            1        


**New Entry Exp name - xyz**

EXPERIMENT TABLE
Experiment_id(auto_incremented)  Exp_name
1                                  abc

2                                  xyz

RESULT TABLE
Result_id   Experiment_id  Experiment_name
1              1                 abc   
2              1                 abc
3              1                 abc  

4              2                 xyz
5              2                 xyz
6              2                 xyz

我知道如何提取最近的 Experiment_id 但我无法提取最近的“Exp_Name”

查询最近有效的 Experiment_id。

CREATE DEFINER=`new`@`%` TRIGGER `worksheet`.`TestResult_BEFORE_INSERT` BEFORE INSERT ON `TestResult` FOR EACH ROW
set new.Experiment_id = (select max(Experiment_id) from TestExperiment)

我尝试提取最近的 Experiment_Name

CREATE DEFINER=`new`@`%` TRIGGER `worksheet`.`TestResult_BEFORE_INSERT_1` BEFORE INSERT ON `TestResult` FOR EACH ROW
set new.Experiment_Name = (select Experiment_Name from TestExperiment where Experiment_id = max(Experiment_id))

不起作用,引发语法错误。

我正在使用 mysql 5.6。请哪位大神帮帮我,谢谢!!

标签: mysql

解决方案


使用ORDER BY ... LIMIT 1查询:

CREATE TRIGGER `TestResult_BEFORE_INSERT_1`
BEFORE INSERT ON `TestResult` FOR EACH ROW
set new.Experiment_Name = (
    select Experiment_Name
    from TestExperiment
    order by Experiment_id desc
    limit 1
);

如果要复制两个值(Experiment_idExperiment_Name),可以使用SELECT ... INTO ...语法将值存储到局部变量中,然后将它们复制到所需的列中:

DELIMITER //

CREATE TRIGGER `TestResult_BEFORE_INSERT`
BEFORE INSERT ON `TestResult` FOR EACH ROW
BEGIN
  DECLARE v_id INT;
  DECLARE v_name TEXT;

  SELECT Experiment_id, Experiment_Name INTO v_id, v_name
  FROM TestExperiment
  ORDER BY Experiment_id DESC
  LIMIT 1;

  SET new.Experiment_id   = v_id;
  SET new.Experiment_Name = v_name;

END //

DELIMITER ;

请参阅db-fiddle上的演示


推荐阅读