摘要:
本篇写的是触发器和外键约束
关键词: 触发器 | 外键约束 | 储存表链接更新 | Mysql
之所以用这个标题而没用触发器或者外键约束的原因,
1、是因为在做出这个需求之前博主是对触发器和外键约束丝毫理不清楚的,所以这也是打算写博客的主要原因——在解决完工作需求后,通过博客梳理整个解决问题的思路,加深记忆的同时,也相当于给自己做一份线上笔记,方便以后取用。
2这个标题比较接地气,因为老板就是这样给我提需求的
先说需求:
A关联B表派生C表 C随着A,B 的更新而更新
走的弯路:
关联更新,所以我的重点找到关联上去了,然后就找到了外键,看了一大波外键的文章博客,当我成功设置好外键时候,测试删除没问题,插入不会更新,所以我一开始以为是我外键设置的问题
直到我继续找资料看到一句话:
sql里的外键和主键的定义是一样的,都是代表了索引
(这句话看了好多次,第一次是设置外键时候没法设置,看了这句话才知道要先设置索引,具体外键的设置问题,会 再写一篇博客详细说明,里面涉及的内容还是比较多的)
所以我就想到了什么?主键是约束条件啊!定义一样,所以、、、、
外键也是约束条件,瞬间想通了为什么删除是同步的,插入不同步,被约束掉了
肯定有小伙伴好奇,既然决定另外要写外键约束了 为什么这里还要提一笔呢?——因为同样是这波弯路 省了我触发器里一条语句,极大的提高了触发器的效率,重点是看到有文章说触发器里写select容易崩,而我又不得不写select 所以能省一笔就省一笔吧,具体怎么省的,在写完正确解决这个需求的方法后文末会提及!
重点来了!
解决办法:——触发器
在百度大佬的帮助下我终于回归正途,触发器,插入时候触发更新
DELIMITER //
CREATE TRIGGER test_tri
AFTER
INSERT
ON test
FOR EACH ROW #每修改一行执行一次
BEGIN
INSERT INTO test2(字段1,字段2,字段3) (SELECT 字段1,字段2,字段3 FROM test WHERE 字段1 NOT IN (SELECT 字段1 FROM test2));
END //
DELIMITER;
我以为找到触发器就算解决了,谁知道九九八十一难少一难都得被老乌龟摔河里去!触发器这里面还要 两个坑
坑① 之前是用过触发器的,所以知道触发器就很好办了嘛!然后码出了如下代码
#错误示范(准确的 说是非标准示范,我Navicat运行还是可以跑的)
CREATE TRIGGER test_tri
AFTER
INSERT
ON test
FOR EACH ROW #每修改一行执行一次
BEGIN
INSERT INTO test2(字段1,字段2,字段3) (SELECT 字段1,字段2,字段3 FROM test WHERE 字段1 NOT IN (SELECT 字段1 FROM test2));
END ;
Sqlyog解释器跑不出来,报错
百度大佬又一次救了我,DELIMITER和自定义字符,顺带着衍生出了
坑②:虽然跑的通,触发器的效果也杠杠滴,但是看着
这个错误代码四个大字还是有点儿不安,不知道是解释器的问题还是什么问题,最终结果就是百般测试下没有问题才放心
文末彩蛋:
上面说的为什么外键约束省了我一大波空间?
如果不设置外键约束的话,我对test操作删除时,我触发器的主体还需要添加一个delete语句(带select条件的),所以外键可以帮我约束我就很省心了!
再加一句,标题是三个表,我只写了两个表,其实原理都是一样的!会一个后面的就自由发散吧!哈哈