mysql触发器学习

先创建两张表,一张货物表,一张订单表
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
  `gid` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `num` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of goods
-- ----------------------------
INSERT INTO `goods` VALUES ('1', 'cat', '33');
INSERT INTO `goods` VALUES ('2', 'dog', '34');
INSERT INTO `goods` VALUES ('3', 'pig', '55');
-- ----------------------------
-- Table structure for ord
-- ----------------------------
DROP TABLE IF EXISTS `ord`;
CREATE TABLE `ord` (
  `oid` int(11) DEFAULT NULL,
  `gid` int(11) DEFAULT NULL,
  `much` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of ord
-- ----------------------------
INSERT INTO `ord` VALUES ('1', '1', '1');
INSERT INTO `ord` VALUES (null, '2', '2');
DROP TRIGGER IF EXISTS `t2`;
DELIMITER ;;
CREATE TRIGGER `t2` AFTER INSERT ON `ord` FOR EACH ROW BEGIN
	UPDATE goods
SET num = num - new.much
WHERE
	gid = new.gid;
END
;;
DELIMITER ;
 
 

目的:使用触发器当订单表中新增一条订单时,货物中则对应减少购买的数量

第一种:

create trigger t1
 after
 insert
 on ord
 for each row
 begin
 update goods set num=num-1 where gid =1;
 end

上面的触发器是固定的,不灵活。所以下面提供灵活的方法

查看自定义的触发器:

 show triggers \G$

上面的 $为结束符

delimiter $

注意:一张表不能创建两个相同操作的触发器,否则会报错。所以在创建第二个触发器前,我先把之前创建的触发器删除掉

 drop trigger t2$

触发器t2,已经在上面的ord表中了,就不写了

===触发器的引用行变量

看上面写的触发器,用到了new。是表示什么意思呢?

当新增一行时,用new 表是新行

当删除一行时,用old 表示旧行


结果:每当ord表有新增一条数据时,就会触发写的触发器,从而去更新goods表

下面的链接讲的更详细,呵呵

http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html

你可能感兴趣的:(mysql触发器学习)