借助Navicat在MySQL中实现多SKU共享库存的管理方案
实现MySQL库存组同步更新方案
针对你的需求(同一UPC组内,任意SKU库存变化时同步更新组内所有SKU的库存),可以通过MySQL触发器实现,以下是具体步骤和代码:
核心逻辑
组的定义:同一UPC下,以AliasOf为null的主SKU为核心,所有AliasOf指向该主SKU的别名SKU与主SKU构成一个库存同步组。当组内任意SKU的Quantity字段发生变更时,同步更新组内所有SKU的Quantity为新值。
1. 创建同步更新触发器
假设你的表名为inventory,创建AFTER UPDATE触发器来监听库存变更:
DELIMITER // CREATE TRIGGER sync_inventory_group AFTER UPDATE ON inventory FOR EACH ROW BEGIN DECLARE main_sku VARCHAR(255); -- 仅当库存实际发生变化时执行同步 IF OLD.Quantity != NEW.Quantity THEN -- 确定当前SKU所属组的主SKU IF NEW.AliasOf IS NULL THEN SET main_sku = NEW.SKU; ELSE SET main_sku = NEW.AliasOf; END IF; -- 同步组内所有SKU的库存,避免重复更新触发递归 UPDATE inventory SET Quantity = NEW.Quantity WHERE UPC = NEW.UPC AND (SKU = main_sku OR AliasOf = main_sku) AND Quantity != NEW.Quantity; END IF; END // DELIMITER ;
2. (可选)新增SKU时自动同步库存
如果需要支持新增别名SKU时自动同步主SKU的库存,可以添加AFTER INSERT触发器:
DELIMITER // CREATE TRIGGER sync_new_inventory AFTER INSERT ON inventory FOR EACH ROW BEGIN DECLARE main_quantity INT; -- 插入的是别名SKU时,同步主SKU的库存值 IF NEW.AliasOf IS NOT NULL THEN SELECT Quantity INTO main_quantity FROM inventory WHERE SKU = NEW.AliasOf AND UPC = NEW.UPC; UPDATE inventory SET Quantity = main_quantity WHERE SKU = NEW.SKU AND UPC = NEW.UPC; END IF; END // DELIMITER ;
3. 优化建议
- 添加索引:为避免全表扫描,创建联合索引提升更新效率:
CREATE INDEX idx_upc_aliasof ON inventory(UPC, AliasOf); CREATE INDEX idx_upc_sku ON inventory(UPC, SKU); - 权限说明:创建触发器需要当前数据库用户拥有
TRIGGER权限。 - 事务一致性:触发器与原更新/插入操作处于同一事务中,若同步更新失败,原操作会自动回滚,保证数据一致性。
验证示例
以你提供的测试数据为例:
- 执行
UPDATE inventory SET Quantity = 10 WHERE SKU = '123456789123b';,组内所有SKU(123456789123a、123456789123b、123456789123c、123456789123d)的Quantity都会被更新为10。 - 执行
UPDATE inventory SET Quantity = 8 WHERE SKU = '123456789123a';,所有别名SKU的Quantity也会同步变为8。
内容的提问来源于stack exchange,提问作者Pacifico
相关产品推荐
相关产品推荐

