mysql觸發器建立語法

最近有一個需求須要使用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 ;
相關文章
相關標籤/搜索