在每次使用触发器插入MySQL 5.6中的目标表后,尝试将最后更新的row_id从源表拉到另一个表

时间:2019-09-27 18:03:57

标签: mysql triggers

您好,我有两个表格实验和示例。 我想创建一个触发器,以便每当我向Sample表中插入一行时,都应将MySQL在“ Experiment”表中生成的最新“ Experiment_id”拉入名为“ Experiment_id”的“ Sample”表的列中。

EXPERIMENT TABLE
Experiment_id(auto_incremented)  Exp_name
1                                  abc

SAMPLE TABLE
Sample_id   Experiment_id sample_name
1              1                    
2              1           
3              1                    
4              1           
5              1           
6              1

**New Entry Exp name - xyz**

EXPERIMENT TABLE
Experiment_id(auto_incremented)  Exp_name
1                                  abc
2                                  xyz

SAMPLE TABLE
Sample_id   Experiment_id sample_name
1              1                    
2              1           
3              1                    
4              1           
5              1           
6              1
7              2           
8              2          
9              2                    
10             2 

因此,当“ Experiment”表中仅存在“ Experiment_id” 1时,将生成Sample ID“ 1-6”,而当MySQL自动生成了Experiment_id 2时,将生成Sample_id“ 7-10”。 >

我正在使用mysql 5.6。请有人帮助我,谢谢!

2 个答案:

答案 0 :(得分:0)

您将必须同时使用触发器来跟踪插入和更新:

 DROP TRIGGER IF EXISTS trigger_experiment_after_insert;
  DELIMITER $$

  CREATE  TRIGGER trigger_experiment_after_insert
  AFTER INSERT ON experiment FOR EACH ROW
  BEGIN
    -- sample_id will be auto_increment
    INSERT INTO sample_log SET experiment_id = NEW.experiment_id;
  END; $$

  DELIMITER ;

使用更新触发器来跟踪更新:

 DROP TRIGGER IF EXISTS trigger_experiment_after_update;
  DELIMITER $$

  CREATE  TRIGGER trigger_experiment_after_update
  AFTER UPDATE ON experiment FOR EACH ROW
  BEGIN
    -- sample_id will be auto_increment
    INSERT INTO sample_log SET experiment_id = OLD.experiment_id;
  END; $$

  DELIMITER ;

答案 1 :(得分:0)

我不会为此使用触发器。只需在INSERT语句中使用子查询:

INSERT INTO SAMPLE (sample_name, Experiment_id) VALUES (
  'sample name',
  (SELECT MAX(Experiment_id) FROM EXPERIMENT)
)

如果要使用触发器,请尝试以下操作:

create trigger SAMPLE_before_insert before insert on SAMPLE FOR EACH ROW 
  set new.Experiment_id = (select max(Experiment_id) from EXPERIMENT);