最难不过坚持丶渊洁 2021-12-04 13:18 采纳率: 75%
浏览 82
已结题

mysql和sql service的触发器问题

问题遇到的现象和发生背景

想要实现药品的入库.如果数据库已经存在.则触发器自动累加数量.否则插入新记录.
考虑到inster触发器让我难以修改数据,必须是before,但是before我获取不到inster插入的值.就无法在现有基础实现累加.如果在after触发,可以获取到新数量.但是无法修改数据了.因此采用update触发器.但是很奇怪.update触发器无法插入新记录.!!起初以为mysql有问题.但是我同学使用的sql service也存在同样的问题,无法增添新纪录!它使用的是insert触发器.

问题相关代码,请勿粘贴截图
# 药品入库操作 触发器
# 触发器应该建立在视图上,这里直接是实体

drop trigger drugs_trigger;
delimiter $$ -- 自定义结束符号
create trigger drugs_trigger
    BEFORE UPDATE
    ON drugs
    FOR EACH ROW
BEGIN

    IF EXISTS(SELECT @drug_id FROM drugs WHERE NEW.drug_id)  THEN
        #不允许写update来操作同一张表,即禁止递归操作
        #update drugs SET drug_quantity = OLD.drug_quantity + NEW.drug_quantity where drug_id=NEW.drug_id;
        #触发器从NEW.xxxx取得这个值并返回它
        # 由于mysql的触发器十分简陋,不能屏蔽掉原语句,因此触发触发器的语句依然会被执行
        #因此有如下操作做到 instead of方法
        SET NEW.drug_quantity = OLD.drug_quantity + NEW.drug_quantity;
        SET NEW.drug_id = OLD.drug_id;
        SET NEW.drug_price = OLD.drug_price;
        SET NEW.drug_storage = OLD.drug_storage;
        SET NEW.drug_date = OLD.drug_date;
        SET NEW.usefull_life = OLD.usefull_life;
    ELSE#必须是增强写法Replace into   这里的这种操作相当于sql serverinstead of
        INSERT INTO  drugs(drug_id, drug_name, drug_price, drug_quantity, drug_storage, drug_date, usefull_life)
    values (NEW.drug_id,NEW.drug_name,NEW.drug_price,NEW.drug_quantity,NEW.drug_storage,NEW.drug_date,NEW.usefull_life);
    END IF;
END
$$ -- 自定义触发器结束
delimiter ;

#   存在主键约束,所以插入相同数据必报错
UPDATE drugs
SET drug_id='1314251', drug_name='阳春白雪', drug_price=883.00, drug_quantity=200, drug_storage='F-4-291', drug_date='2021-09-01', usefull_life='2022-09-01'
WHERE drug_id='1314251';
运行结果及报错内容

img

我的解答思路和尝试过的方法

使用过insert触发器,考虑过after,before. 检索过csdn,stackoverflow.没有相关解决方案.

我想要达到的结果

当触发器检测到我的药品id不存在数据库中,就添加该数据.

  • 写回答

1条回答 默认 最新

  • 最难不过坚持丶渊洁 Java领域优质创作者 2021-12-04 13:20
    关注

    img


    同学的sql serveice 也存在这样的问题

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集