问题遇到的现象和发生背景
想要实现药品的入库.如果数据库已经存在.则触发器自动累加数量.否则插入新记录.
考虑到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 server的instead 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';
运行结果及报错内容
我的解答思路和尝试过的方法
使用过insert触发器,考虑过after,before. 检索过csdn,stackoverflow.没有相关解决方案.
我想要达到的结果
当触发器检测到我的药品id不存在数据库中,就添加该数据.