MySQL创建before insert触发器自动填充barang表kategori_nama的最优方案
触发器自动填充关联字段解决方案
你之前的触发器存在三个核心问题:
- 错误关联了
barang表:分类名称仅存储在kategori表,查询时完全不需要关联barang表,关联后自然会出现首条同分类商品插入时无匹配行的问题 - SELECT子句未指定取值字段,语法不规范
- 未限制返回行数,当
kategori表存在重复kode时就会触发多行返回报错
最优实现方案
1. 修复触发器逻辑
直接从kategori表查询对应编码的分类名即可,不需要关联任何其他表:
DELIMITER // CREATE TRIGGER fill_kategori_nama BEFORE INSERT ON barang FOR EACH ROW BEGIN -- 直接查询对应kode的分类名,LIMIT 1避免重复kode导致的多行报错 SELECT nama INTO NEW.kategori_nama FROM kategori WHERE kode = NEW.kategori_id LIMIT 1; END // DELIMITER ;
注:如果你的barang表关联kategori的字段名是kategori而非kategori_id,把WHERE条件里的字段替换为对应名称即可
2. 表结构优化(推荐)
分类表kategori的kode字段本身应该是唯一标识,建议给该字段加唯一约束,从根源避免重复编码的问题:
ALTER TABLE kategori ADD UNIQUE KEY uk_kode (kode);
加完唯一约束后,触发器里的LIMIT 1也可以去掉,逻辑更简洁。
可选:增加非法分类校验
如果需要避免插入不存在的分类编码,可以增加异常抛出逻辑:
DELIMITER // CREATE TRIGGER fill_kategori_nama BEFORE INSERT ON barang FOR EACH ROW BEGIN DECLARE v_kategori_nama VARCHAR(255); SELECT nama INTO v_kategori_nama FROM kategori WHERE kode = NEW.kategori_id; IF v_kategori_nama IS NULL THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入的分类编码在kategori表中不存在'; END IF; SET NEW.kategori_nama = v_kategori_nama; END // DELIMITER ;
内容的提问来源于stack exchange,提问作者tryharder
相关产品推荐
相关产品推荐

