MySQL如何让mechanic表根据carid自动从cars表填充currentcar字段
实现方案
方案1:使用数据库触发器(全自动实现,无需修改业务代码)
这是最贴合需求的实现方式,新增/修改mechanic表的carid字段时,会自动同步关联cars表的Make值到currentcar字段,不需要改动上层业务逻辑。
你需要创建两个触发器,分别覆盖插入和更新两种场景:
-- 插入mechanic数据时触发 DELIMITER // CREATE TRIGGER trg_mechanic_before_insert BEFORE INSERT ON mechanic FOR EACH ROW BEGIN IF NEW.carid IS NOT NULL THEN SELECT Make INTO NEW.currentcar FROM cars WHERE carid = NEW.carid LIMIT 1; END IF; END // DELIMITER ; -- 更新mechanic的carid字段时触发 DELIMITER // CREATE TRIGGER trg_mechanic_before_update BEFORE UPDATE ON mechanic FOR EACH ROW BEGIN IF NEW.carid <> OLD.carid OR (NEW.carid IS NOT NULL AND OLD.carid IS NULL) THEN SELECT Make INTO NEW.currentcar FROM cars WHERE carid = NEW.carid LIMIT 1; END IF; END // DELIMITER ;
注意事项
- 你已经设置了外键约束,不会出现carid不存在的情况,上述触发器可以正常运行。
- 如果后续cars表的Make字段有修改,历史mechanic表的currentcar不会自动同步,如果你需要同步更新,可以额外加一个cars表的更新触发器实现。
方案2:业务SQL层直接实现(无需触发器,适合不允许使用触发器的生产环境)
如果你所在的生产环境禁止使用触发器,可以在写SQL的时候直接关联cars表完成赋值,不需要依赖数据库自动触发:
插入数据示例
INSERT INTO mechanic (firstname, lastname, title, carid, currentcar) SELECT '王', '伟', '高级技师', 1, cars.Make FROM cars WHERE cars.carid = 1;
更新数据示例
UPDATE mechanic m JOIN cars c ON m.carid = c.carid SET m.carid = 2, m.currentcar = c.Make WHERE m.mechanicid = 10;
额外优化建议
currentcar字段本质是冗余存储,如果你不需要保留录入时的Make快照值,完全可以删除这个字段,查询的时候通过联表拿到对应值即可,避免多份存储带来的数据不一致问题:
-- 联表查询直接拿到currentcar,不需要额外存储该字段 SELECT m.*, c.Make AS currentcar FROM mechanic m LEFT JOIN cars c ON m.carid = c.carid;
内容的提问来源于stack exchange,提问作者Robotboy
相关产品推荐
相关产品推荐

