良好的習慣需要慢慢養成,我最近開始不定時寫部落格,主要內容都是開發中遇到的問題,以及解決方式。
今天是解決了觸發器建立失敗報語法錯誤的問題。
其實這問題從昨天開始就出現了,我是第一次使用觸發器,只會簡單的使用。話不多說,直接上程式碼
CREATE TRIGGER trig2
AFTER UPDATE
ON `y`.`counselor`
FOR EACH ROW
BEGIN
IF (select count(id) from `x`.`t_staff` where `create_date_time`=OLD.update_time)>0
THEN
UPDATE `x`.`t_staff`
SET
group_id = 7, create_date_time = NEW.update_time
WHERE
create_date_time = OLD.update_time;
ELSE
INSERT INTO `x`.`t_staff`(`id`, `group_id`, `store_id`, `name`, `mobile`, `password`, `job_number`, `state`, `create_date_time`, `open_id`, `weixin_code`, `weixin_activate_date_time`, `weixin_focus_state`, `weixin_config_id`, `head_img_url`)
VALUES (NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL, NEW.update_time, NULL, NULL, NULL, NULL, NULL, NULL);
END IF;
END;
這個建立觸發器的語句一執行就報錯
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 12
結果我不停地尋找錯誤以及相關文章,在嘗試加入了 delimiter 函數後觸發器建立成功了,程式碼如下:
delimiter //
CREATE TRIGGER trig2
AFTER UPDATE
ON `y`.`counselor`
FOR EACH ROW
BEGIN
IF (select count(id) from `x`.`t_staff` where `create_date_time`=OLD.update_time)>0
THEN
UPDATE `x`.`t_staff`
SET
group_id = 7, create_date_time = NEW.update_time
WHERE
create_date_time = OLD.update_time;
ELSE
INSERT INTO `x`.`t_staff`(`id`, `group_id`, `store_id`, `name`, `mobile`, `password`, `job_number`, `state`, `create_date_time`, `open_id`, `weixin_code`, `weixin_activate_date_time`, `weixin_focus_state`, `weixin_config_id`, `head_img_url`)
VALUES (NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL, NEW.update_time, NULL, NULL, NULL, NULL, NULL, NULL);
END IF;
END;
//
我在建立觸發器的語句錢加上delimiter //,並在建立觸發器的語句最後面補上//,我百度一番之後,瞭解了原因:
如果不使用delimiter修改結束符的話,當我們執行完 ‘UPDATE
x
.t_staff
SET group_id = 7, create_date_time = NEW.update_time WHERE create_date_time = OLD.update_time;’ 這條語句後,mysql直譯器識別到分號就自動執行了,而修改了結束符後,只有我們輸入// 時,建立觸發器這條語句才會執行。
注意:建立完觸發器後要記得將結束符改回分號
delimiter ;
可參考其他文章:https://blog.csdn.net/qq_36925843/article/details/88839477?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-2-88839477.nonecase&utm_term=%E5%88%9B%E5%BB%BA%E8%A7%A6%E5%8F%91%E5%99%A8%20%E6%80%8E%E4%B9%88%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8delimiter&spm=1000.2123.3001.4430
END