2015-09-18 37 views
0

我使用的是MySQL数据库,并希望在桌子上“工作”MySQL的触发器与增量部分

我的架构进行任何插入之前创建一个触发如下:

+-------------+  +--------------+ 
| jobs  |  | machines | 
+-------------+  +--------------+ 
| job_id  | ___| machine_id | 
| job_machine |_| | machine_name | 
| job_name |  +--------------+ 
| job_start | 
+-------------+  

有外国键之间jobs.job_machine和machines.machine_id

job_start是一个日期时间,将用于填写job_name。但它会这样形成

select DATE_FORMAT(job_start, "%y%m%d") from jobs where NEW.job_id; 

我希望job_name成为job_start + job_machine +增量的串联。我会解释。

例如,如果插入的工作是

+--------+-------------+-----------------------+----------+ 
| job_id | job_machine |  job_start  | job_name | 
+--------+-------------+-----------------------+----------+ 
|  1 |   3 | '2015-09-18 14:20:00' |   | 
+--------+-------------+-----------------------+----------+ 

JOB_NAME将是:15091831

但如果类似的工作被创建在同一台机器在同一天将是15091832

我有

CREATE DEFINER = CURRENT_USER TRIGGER `myTable`.`jobs_BEFORE_INSERT` BEFORE INSERT ON `jobs` FOR EACH ROW 
BEGIN 
    select concat((select DATE_FORMAT(job_start, "%y%m%d") from jobs where job_id=NEW.job_id) , (select job_machine from jobs where job_id = NEW.job_id)); 
END 

但我不太确定增量部分。最好的方法是什么?

回答

0

首先确定当前的增量值,然后用它的ID和name:

CREATE DEFINER = CURRENT_USER TRIGGER `myTable`.`jobs_BEFORE_INSERT` 
BEFORE INSERT ON `jobs` FOR EACH ROW 
BEGIN 
DECLARE next_id integer; 
-- select the current highest id and increment it 
SET @next_id := (select max(job_id)+1 
    from jobs 
    where DATE_FORMAT(job_start, '%y%m%d') = DATE_FORMAT(NEW.job_start, '%y%m%d') 
     and job_machine = NEW.job_machine); 
-- if it is the first job for this machine this day then make it nr 1 
IF ISNULL(@next_id) THEN 
    SET @next_id := 1; 
END IF; 
-- then set your new row accordingly 
SET NEW.job_id = @next_id; 
SET NEW.job_name = concat(DATE_FORMAT(NEW.job_start, '%y%m%d'), job_machine, @next_id); 
END 
0

您的触发逻辑不完整。例如,你没有在new中设置任何值,所以触发器什么都不做。

我认为有以下你想要做什么:

CREATE DEFINER = CURRENT_USER TRIGGER `myTable`.`jobs_BEFORE_INSERT` 
    BEFORE INSERT ON `jobs` FOR EACH ROW 
BEGIN 
    select new.job_id := concat(DATE_FORMAT(new.job_start, '%y%m%d'), new.job_machine, 
           RIGHT(MAX(job_name), 1) + 1) 
    from jobs j 
    where j.job_start >= date(new.job_start) and 
      j.job_start < date(new.job_start) + interval 1 day and 
      j.job_machine = new.job_machine 
END