触发器的作用是在增、删、改操作之前(或之后)自动调用的SQL语句或存储过程。比如为了保持数据的一致性,删除订单记录时,触发删除订单详细记录。
[size=medium]1. 创建触发器:[/size]
注:一个触发器只能定义一个操作,如BEFORE INSERT, AFTER UPDATE等。
如Account表:
例1:往表account插入记录,balance小于0时改为0
例2:往表account插入记录,balance小于0时,触发异常
[size=medium]2. 查询触发器:[/size]
[size=medium]3. 删除触发器:[/size]
[size=medium]1. 创建触发器:[/size]
DELIMITER $$ -- 结束符改为$$
CREATE TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name
[FOR EACH ROW]
BEGIN
commands;
END$$
DELIMITER ; -- 结束符改回;
注:一个触发器只能定义一个操作,如BEFORE INSERT, AFTER UPDATE等。
如Account表:
CREATE TABLE ACCOUNT (
USERNAME VARCHAR(50) NOT NULL,
BALANCE INT NOT NULL,
PRIMARY KEY (USERNAME),
CHECK (BALANCE >= 0) -- analyzed but ignored by MySQL
);
例1:往表account插入记录,balance小于0时改为0
DELIMITER $$
CREATE TRIGGER account_beforeInsert BEFORE INSERT ON account
FOR EACH ROW
BEGIN
IF NEW.balance < 0 THEN -- NEW代表新的记录
SET NEW.balance = 0;
END IF;
END$$
例2:往表account插入记录,balance小于0时,触发异常
DELIMITER $$
CREATE TRIGGER account_beforeInsert BEFORE INSERT ON account
FOR EACH ROW
BEGIN
IF NEW.balance < 0 THEN
CALL xxx_yyy();
UPDATE _xxx_yyy SET X = 1; -- 通过调用不存在的存储过程或执行时报错的SQL来引发异常,名称尽量复杂,防止和已有或新建的表或存储过程重名。
END IF;
END$$
[size=medium]2. 查询触发器:[/size]
SHOW TRIGGERS;
[size=medium]3. 删除触发器:[/size]
DROP TRIGGER [database_name.]trigger_name