創建觸發器upd_total:
order表修改num, price, 或discount後,自動更新money的數據。 order表修改oid後,自動更新money對應的oid。
#money.total=order.numnum.pricenum.discount
这是我的代码但是报错(用的是jupter book):
myc.execute('''
create trigger upd_total after update of oid on orders
for each row update money values(new.oid,new.num*new.price);
''')
create trigger upd_total--触发器名称
on order --哪个表触发
after update for each row --update 触发
Begin
if update(num) or update(price) or update(discount) then--如果修改num、price、discount,
--更新money
update money set total=inserted.num*inserted.price*inserted.discount
from money inner join inserted on oid=inserted.oid
end if
--定义两个变量
declare var_oldoid char(10)
declare var_newid char(10)
if update(oid) then--如果更新oid
--保存新的oid
select var_newid =oid from Inserted
--保存旧的oid
select var_oldoid =oid from Deleted
--以旧的oid为条件更新money 的oid字段为新的oid
update money set oid=var_newid where oid=var_oldoid
end if
end
1)有详细的解释,copy进去就可以运行
-- 建立表 --ps: 不用用order这个表名,某些地方可能是保留字,会冲突
CREATE TABLE `t_order` (
`oid` int(11) NOT NULL AUTO_INCREMENT,
`num` int(11) DEFAULT NULL,
`price` decimal(10,2) DEFAULT NULL,
`money` decimal(10,2) DEFAULT NULL,
`discount` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`oid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- 准备一条数据
INSERT INTO `t_order` (`num`, `price`, `money`, `discount`) VALUES ('3', '6.00', '14.40', '0.80');
-- 创建触发器,如果存在就删除
DROP TRIGGER if EXISTS upd_total;
-- 执行创建触发器
CREATE TRIGGER upd_total BEFORE UPDATE ON t_order FOR EACH ROW
BEGIN
set new.money = (SELECT new.num * new.price * new.discount FROM t_order WHERE oid = new.oid) ;
END;
-- 测试
-- 测试前数据
SELECT money from t_order where oid =1;
-- 更新一条数据
update t_order set num = 3 where oid = 1;
-- 测试号后
SELECT money from t_order where oid =1;
可以参考如下方式创建,修改同理。
drop trigger if exists insert_user;
create trigger insert_user
-- 触发表 user
after insert on user
for each row
begin
-- 插入目标表、本地:本地数据库.用户表,如需指定字段在后面拼接(本地数据库.用户表.id)
insert into test.user
-- 触发表、远程:远程数据库.用户表,如需指定字段values里直接拼接(远程数据库.用户表.id)
values(pro.user);
end;
授人以鱼不如授人以渔
【Mysql 触发器-两个数据库的表数据同步-步骤与问题解决】https://mbd.baidu.com/ma/s/VepkdIZW
具体的报错信息没发出来,看看具体报什么错