2014-01-13 45 views
0

我想寫一個觸發器,將表中所有條目從1到10進行排序(最大值爲10,最小值爲1,所有其他值都在其間分配整數值)。下面是觸發代碼:這個MySQL觸發器排名有什麼問題?

DELIMITER $$ 
CREATE TRIGGER risks_before_insert BEFORE INSERT ON risks 
FOR EACH ROW 
BEGIN 

DECLARE n_project_id integer; #project_id associated with risk 
DECLARE max_cost double; #previous maximum expected_cost in project 
DECLARE min_cost double; #previous minimum expected_cost in project 
DECLARE max_impact double; #previous maximum impact_effect in project 
DECLARE min_impact double; #previous minimum impact_effect in project 
DECLARE slope double; #slope for prioritizing function 

SELECT t.project_id INTO n_project_id FROM tasks t WHERE t.task_id = NEW.task_id; #GET PROJECT_ID ASSOCIATED WITH THE RISK 

SET NEW.expected_cost = NEW.probability * NEW.cost_impact, NEW.overall_impact = NEW.probability * NEW.impact_effect; #CALCULATE EXPECTED_COST AND OVERALL_IMPACT FIELDS 

SELECT MAX(expected_cost), MIN(expected_cost), MAX(overall_impact), MIN(overall_impact) INTO max_cost, min_cost, max_impact, min_impact FROM view_risks WHERE r.project_id = n_project_id; #GET EXTREME VALUES FROM TABLE, STORE IN MEMORY 

/* 
Update Priority Monetary Rankings 
*/ 
IF (max_cost IS NULL OR min_cost IS NULL) THEN #check for empty table 
    SET NEW.priority_monetary = 10; 
ELSEIF ((NEW.expected_cost <= max_cost) AND (NEW.expected_cost >= min_cost)) THEN 
#NEW VALUE DOES NOT CHANGE TABLE EXTREMES 
    IF (max_cost - min_cost = 0) THEN 
     SET NEW.priority_monetary = 10; 
    ELSE 
     SET slope = 9/(max_cost - min_cost); 
SET NEW.priority_monetary = slope * (NEW.expected_cost - min_cost) + 1; 
    END IF; 
ELSEIF (NEW.expected_cost > max_cost) THEN 
    SET NEW.priority_monetary = 10; 
    SET slope = 9/(NEW.expected_cost - min_cost); 
    UPDATE risks SET priority_monetary = slope * (expected_cost - min_cost) + 1 WHERE project_id = n_project_id; 
ELSE #NEW VALUE CORRESPONDS TO A MINIMUM 
    SET NEW.priority_monetary = 1; 
    SET slope = 9/(max_cost - NEW.expected_cost); 
    UPDATE risks SET priority_monetary = slope * (expected_cost - min_cost) + 1 WHERE project_id = n_project_id; 
END IF; 

/* 
Update Priority Effect Rankings 
*/ 
IF (max_impact IS NULL OR min_impact IS NULL) THEN #check for empty table 
    SET NEW.priority_effect = 10; 
ELSEIF ((NEW.overall_impact <= max_impact) AND (NEW.overall_impact >= min_impact)) THEN 
#NEW VALUE DOES NOT CHANGE TABLE EXTREMES 
    IF (max_cost - min_cost = 0) THEN 
     SET NEW.priority_effect = 10; 
    ELSE 
     SET slope = 9/(max_impact - min_impact); 
SET NEW.priority_effect = slope * (NEW.overall_impact - min_impact) + 1; 
    END IF; 
ELSEIF (NEW.overall_impact > max_impact) THEN 
    SET NEW.priority_effect = 10; 
    SET slope = 9/(NEW.overall_impact - min_impact); 
    UPDATE risks SET priority_effect = slope * (overall_impact - min_impact) + 1 WHERE project_id = n_project_id; 
ELSE #NEW VALUE CORRESPONDS TO A MINIMUM 
    SET NEW.priority_effect = 1; 
    SET slope = 9/(max_impact - NEW.overall_impact); 
    UPDATE risks SET priority_effect = slope * (overall_impact - min_impact) + 1 WHERE project_id = n_project_id; 
END IF; 
END 
DELIMITER ; 

不過,我收到以下錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5 

誰能解釋一下什麼是錯的?爲了便於參考,我們的排名算法由以下函數用常數maxval和minval來描述:

Rank(x)= 1 + slope(x - minval),其中slope = 9 /(maxval - minval)。

謝謝!

附加信息:

字段類型: expected_cost =>十進制(11,2) priority_monetary => TINYINT(2)

示例值: expected_cost => 1000.00 priority_monetary => 2

+0

你可以爲表的模式和樣本數據集包括在扳機,你的語法錯誤,我已經格式化的觸發器的語法和我沒有發現任何問題 –

+0

@MKhalidJunaid我有相應地更新了帖子 – Paul

回答

1

你有ELSE IF你應該在哪裏使用ELSEIF。

同樣@Mihai寫道:你的缺點不會出現作爲缺點,並且你有UPDATE後的關鍵字TABLE(應該只有UPDATE tableName)。

PS我建議你使用MySql的一些工具,如MySql Workbench,它有Windows,大多數linux系統和OSX的發行版。它會讓你工作更好,並檢查你的語法。

更改後的代碼:

DELIMITER $$ 
CREATE TRIGGER risks_before_insert 
BEFORE INSERT ON risks 
FOR EACH ROW 
BEGIN 

DECLARE max_cost double; #previous maximum expected_cost in project 
DECLARE min_cost double; #previous minimum expected_cost in project 
DECLARE slope double; #slope for prioritizing functioN 

SELECT MAX(expected_cost), MIN(expected_cost) INTO max_cost, min_cost FROM view_risks; #GET EXTREME VALUES FROM TABLE, STORE IN MEMORY 

/* 
Update Priority Monetary Rankings 
*/ 
IF (max_cost IS NULL OR min_cost IS NULL) THEN #check for empty table 
    SET NEW.priority_monetary = 10; 
ELSEIF ((NEW.expected_cost <= max_cost) AND (NEW.expected_cost >= min_cost)) THEN #NEW VALUE DOES NOT CHANGE TABLE EXTREMES 
    IF (max_cost - min_cost = 0) THEN 
     SET NEW.priority_monetary = 10; 
    ELSE 
     SET slope = 9/(max_cost - min_cost); 
     SET NEW.priority_monetary = slope * (NEW.expected_cost - min_cost) + 1; 
    END IF; 
ELSEIF (NEW.expected_cost > max_cost) THEN 
    SET NEW.priority_monetary = 10; 
    SET slope = 9/(NEW.expected_cost - min_cost); 
    UPDATE risks SET priority_monetary = slope * (expected_cost - min_cost) + 1; 
ELSE #NEW VALUE CORRESPONDS TO A MINIMUM 
    SET NEW.priority_monetary = 1; 
    SET slope = 9/(max_cost - NEW.expected_cost); 
    UPDATE risks SET priority_monetary = slope * (expected_cost - NEW.min_cost) + 1; 
END IF; 

END $$ 
DELIMITER ; 
+0

謝謝,我修復了減號,並且我還修復了UPDATE TABLE語法。但是,我發佈的代碼實際上是整個觸發器的一部分,我只包含該部分以使其更簡單。但是,我仍然收到錯誤,可能是由於您做出的其他小調整之一。你能看看整個觸發代碼嗎?我編輯了上面的帖子和錯誤消息以包含它。 – Paul

+0

我也修復了ELSEIF,但仍然存在上述相同的問題。 – Paul

+1

現在您在上次END之後沒有$$。 使用一些MySql工具作爲[http://www.mysql.com/products/workbench/] – michalczukm

1

在我的MySql客戶端中,您的缺點並不會顯示爲不足,也做了一些小修改(UPDATE tableName without the keyword TABLE)

DELIMITER $$ 
CREATE TRIGGER risks_before_insert 
BEFORE INSERT ON risks 
FOR EACH ROW 
BEGIN 

DECLARE max_cost double; #previous maximum expected_cost in project 
DECLARE min_cost double; #previous minimum expected_cost in project 
DECLARE slope double; #slope for prioritizing functioN 

SELECT MAX(expected_cost), MIN(expected_cost) INTO max_cost, min_cost FROM view_risks; #GET EXTREME VALUES FROM TABLE, STORE IN MEMORY 

/* 
Update Priority Monetary Rankings 
*/ 
IF (max_cost IS NULL OR min_cost IS NULL) THEN #check for empty table 
    SET NEW.priority_monetary = 10; 
ELSE IF ((NEW.expected_cost <= max_cost) AND (NEW.expected_cost >= min_cost)) THEN #NEW VALUE DOES NOT CHANGE TABLE EXTREMES 
    IF (max_costs - min_cost = 0) THEN 
     SET NEW.priority_monetary = 10; 
    ELSE 
     SET slope = 9/(max_cost - min_cost); 
     SET NEW.priority_monetary = slope * (NEW.expected_cost - min_cost) + 1; 
    END IF; 
ELSE IF (NEW.expected_cost > max_cost) THEN 
    SET NEW.priority_monetary = 10; 
    SET slope = 9/(NEW.expected_cost - min_cost); 
    UPDATE risks SET priority_monetary = slope * (expected_cost - min_cost) + 1; 
ELSE #NEW VALUE CORRESPONDS TO A MINIMUM 
    SET NEW.priority_monetary = 1; 
    SET slope = 9/(max_cost - NEW.expected_cost); 
    UPDATE risks SET priority_monetary = slope * (expected_cost - NEW.min_cost) + 1; 
END IF; 
END $$ 
DELIMITER ; 
+0

謝謝,我修復了減號,並且我還修復了UPDATE TABLE語法。但是,我發佈的代碼實際上是整個觸發器的一部分,我只包含該部分以使其更簡單。但是,我仍然收到錯誤,可能是由於您做出的其他小調整之一。你能看看整個觸發代碼嗎?我編輯了上面的帖子和錯誤消息以包含它。 – Paul

+0

查看下面的答案,你有ELSE IF你應該在哪裏使用ELSEIF – michalczukm