2015-09-18 40 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