最近有一個需求須要使用mysql的觸發器來實現,因而就開始編寫觸發器的建立sql語句,在網上找了一下建立觸發器的說明,按照樣子來編寫,居然說有語法錯誤,後來在mysql官方的文檔資料裏面找到了正確的語法結構,而後就建立成功了。html
因爲網上找到的大多數都是錯誤的,在這裏就只是大概說一下網上的都是什麼樣子,看看就好了mysql
create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END
注意,最後有一個「END」,可是前面卻沒有「begin」,其實,出錯就是這個end形成的。sql
咱們訪問mysql官方的文檔,搜索「trigger」很容易就看到關於觸發器的說明了bash
http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.htmlcode
這個文檔是關於5.7的,可是對於觸發器建立語法來講,應該沒有什麼區別,在開頭就給出了建立的語法舉例htm
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); Query OK, 0 rows affected (0.03 sec) mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)
因爲這是一個簡單的語句,因此沒有更改行結束符,若是要更改行結束符也是很容易。blog
後面還有在須要執行不少句語句的時候的寫法,這個時候就是須要「begin」和「end」的,它們是成對出現的文檔
CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | delimiter ;
而後我便攜了我本身的建立觸發器的sql語句,執行是OK的get
DROP TABLE IF EXISTS `t_blog`; CREATE TABLE `t_blog` ( `b_id` int(16) NOT NULL AUTO_INCREMENT, `title` varchar(64) NOT NULL, `content` longtext NOT NULL, `create_time` datetime NOT NULL, `tags` varchar(64) NOT NULL, `uni_uri` varchar(64) NOT NULL, PRIMARY KEY (`b_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1000000001 DEFAULT CHARSET=utf8; DROP TRIGGER IF EXISTS `tri_blog_default_create_time`; DELIMITER ;; CREATE TRIGGER `tri_blog_default_create_time` BEFORE INSERT ON `t_blog` FOR EACH ROW set NEW.create_time = NOW(); ;; DELIMITER ;