在每次使用触发器插入MySQL 5.6中的目标表后,将一列从源表拉至另一表

时间:2019-11-11 17:03:36

标签: mysql

您好,我有两个表格“实验”和“结果”。 我想创建一个触发器,以便每当我在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。请有人帮助我,谢谢!

1 个答案:

答案 0 :(得分:1)

使用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上观看演示