-- 触发器
-- 在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。
-- 它是在一个特殊的数据库事件,如INSERT.UPDATE或DELETE发生时,自动激活的一段代码。
-- 语法
CREATE TRIGGER 触发器名
{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON 表名 FOR EACH ROW 要出发的sql语句;
-- 使用别名OLD和NEW,能够引用与处罚程序相关的表中的列。
-- OLD.col_name在更新或删除它之前,引用已有行中的一列。
-- NEW.col_name在更新它之后引用将要插入的新行的一列或已有行的一列。
-- 触发器只能定义在永久表上,不能对临时表创建。
-- MySql对同一个表相同出发时间的相同出发时间,只能定义一个触发器。
-- 示例,插入订单明细,更新订单总金额等。
CREATE TABLE orders
(
id INT PRIMARY KEY AUTO_INCREMENT,
name1 VARCHAR(50),
itemcount FLOAT(10,2)
);
CREATE TABLE orderitem
(
id INT PRIMARY KEY AUTO_INCREMENT,
name1 VARCHAR(50),
price FLOAT(10,2),
counts INT,
oid INT,
CONSTRAINT oid FOREIGN KEY(oid) REFERENCES orders(id)
);
DELIMITER //
CREATE TRIGGER total AFTER INSERT ON orderitem FOR EACH ROW
BEGIN
DECLARE newid INT DEFAULT 0;
DECLARE newprice FLOAT(10,2) DEFAULT 0;
DECLARE newcounts INT DEFAULT 0;
DECLARE sum1 FLOAT(10,2) DEFAULT 0;
SELECT oid,price,counts INTO newid,newprice,newcounts FROM orderitem WHERE id=new.id;
SET sum1=newprice * newcounts;
UPDATE orders SET itemcount = itemcount + sum1 WHERE id = newid;
END //
DELIMITER ;
DELIMITER //
CREATE TRIGGER total1 AFTER UPDATE ON orderitem FOR EACH ROW
BEGIN
DECLARE orderid INT DEFAULT 0;
DECLARE xprice FLOAT(10,2) DEFAULT 0;
DECLARE xcounts INT DEFAULT 0;
DECLARE old_sum FLOAT(10,2) DEFAULT 0;
DECLARE new_sum FLOAT(10,2) DEFAULT 0;
SELECT oid,OLD.price,OLD.counts INTO orderid,xprice,xcounts FROM orderitem WHERE id=OLD.id;
SET old_sum = xprice * xcounts;
SELECT NEW.price,NEW.counts INTO xprice,xcounts FROM orderitem WHERE id = New.id;
SET new_sum = xprice * xcounts;
UPDATE orders SET itemcount = itemcount + (new_sum - old_sum) WHERE id = orderid;
END //
DELIMITER ;
-- 查看触发器
SHOW TRIGGERS;
SELECT * FROM `information_schema`.`TRIGGERS`;
-- 删除触发器
DROP TRIGGER 触发器名;
INSERT INTO emp1 (SELECT * FROM emp WHERE id NOT IN (SELECT id FROM emp1));
REPLACE INTO emp1 SELECT * FROM emp;
-- REPLACE INTO要谨慎使用,原因如下:
-- REPLACE INTO 跟 INSERT 功能类似,不同点在于:replace INTO 首先尝试插入数据到表中,
-- 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。