• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

触发器触发的条件是表还是字段?该如何处理

mysql 搞代码 7年前 (2018-05-31) 146次浏览 已收录 0个评论

触发器触发的条件是表还是字段?
如下的数据库,如果我更新px表的isdel字段,会相应更新其他2表中的isdel字段
但我想知道,如果我UPDATE 语句中,没有涉及到isdel字段的话,他也会触发这个触发器吗?
如下语句

SQL code

  /* 这句肯定会触发触发器 */ UPDATE `px` SET `isdel` = 1 WHERE `id` = 1;  /* 下面这句呢?也会触发触发器? */ UPDATE `px` SET `desc` = "XXOO" WHERE `id` = 2;  

欢迎大家阅读《触发器触发的条件是表还是字段?该如何处理》,跪求各位点评,by 搞代码

如果上面第二条语句也会触发触发器,那该怎么改它才会在只有UPDATE中指明更新isdel字段才会触发触发器呢?

SQL code

  
/* 建表语句 */
DROP DATABASE IF EXISTS `testtest`;
CREATE DATABASE `testtest` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `testtest`;

DROP TABLE IF EXISTS `px`;
CREATE TABLE IF NOT EXISTS `px` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `desc` varchar(10) CHARACTER SET gbk DEFAULT NULL,
  `isdel` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除(0:不删除|1:删除)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

DROP TABLE IF EXISTS `spec`;
CREATE TABLE IF NOT EXISTS `spec` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `pid` int(2) NOT NULL,
  `isdel` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除(0:不删除|1:删除)',
  PRIMARY KEY (`id`),
  KEY `pact_id` (`pid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

DROP TABLE IF EXISTS `goods`;
CREATE TABLE IF NOT EXISTS `goods` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `pid` int(2) NOT NULL,
  `sid` int(2) NOT NULL,
  `isdel` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除(0:不删除|1:删除)',
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  KEY `sid` (`sid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

/* 添加约束 */
ALTER TABLE `goods`
  ADD CONSTRAINT `goods_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `px` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `goods_ibfk_2` FOREIGN KEY (`sid`) REFERENCES `spec` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `spec`
  ADD CONSTRAINT `spec_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `px` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
COMMIT;

/* 插入数据 */
INSERT INTO `px`(`isdel`) VALUES (0),(0),(0);
INSERT INTO `spec`(`pid`) VALUES (1),(1),(1),(2),(2),(3),(3);
INSERT INTO `goods`(`pid`,`sid`) VALUES (1,1),(1,2),(1,2),(1,3),(1,3),(1,3),(2,4),(2,5),(2,5),(2,5),(3,6),(3,7),(3,7),(3,7);

/* 添加触发器 */
/* 更新px的isdel字段时,更新spec和goods的isdel字段 */
DELIMITER $$
CREATE TRIGGER `hidden_px` BEFORE UPDATE ON `px`
FOR EACH ROW
BEGIN
UPDATE `spec`,`goods`
SET `spec`.`isdel` = NEW.`isdel`,`goods`.`isdel` = NEW.`isdel`
WHERE NEW.`id` = `spec`.`pid` AND NEW.`id` = `goods`.`pid`;
END$$
DELIMITER ;
COMMIT;

——解决方案——————–
但我想知道,如果我UPDATE 语句中,没有涉及到isdel字段的话,他也会触发这个触发器吗?

但添加了IF判断,所以应该只是触发触发器,但是没进行相应更新吧?


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:触发器触发的条件是表还是字段?该如何处理
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址