呆萌小新@渊洁 2021-12-04 13:18 采纳率: 100%
浏览 73
已结题

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条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥20 kinect 使用 unity 开发使用手势旋转相机
      • ¥20 一个关于人脸识别的实训报告
      • ¥50 LoopyCuts编译运行问题
      • ¥20 VS2019如何添加.mdf文件失败
      • ¥15 SeaTunnel多Transform配置问题
      • ¥15 消除字符串,求最短字符串长度
      • ¥20 有人做基于集员滤波的异常值处理相关的内容吗?(语言-matlab)
      • ¥30 matlab编程,用chatGPT帮助,但给出的code总是报错。
      • ¥15 离线安装VS2017出现报错
      • ¥50 opengl2怎么将梯形的纹理映射在矩形上面不变形