我想寫一個觸發器,將表中所有條目從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
你可以爲表的模式和樣本數據集包括在扳機,你的語法錯誤,我已經格式化的觸發器的語法和我沒有發現任何問題 –
@MKhalidJunaid我有相應地更新了帖子 – Paul