MySQL循环应生成350条vino表数据却仅生成109条问题排查
问题修复:酒窖数据库vino表插入350条随机数据失败
问题原因
你遇到的插入条数不足问题,核心原因是原存储过程循环随机选取Bottiglia表的codice时频繁出现重复值,而vino表的codice字段作为外键(大概率同时设了唯一约束),重复值会被数据库拒绝插入,最终仅成功插入不重复的109条。
另外需先确认Bottiglia表中tipo_bottiglia='vino'的记录总数是否≥350,如果总数不足,无论如何都无法插入350条不重复数据。
验证可用数据量
先执行这条SQL确认可用的酒瓶记录数:
SELECT COUNT(*) AS available_vino_bottles FROM Bottiglia WHERE tipo_bottiglia='vino';
如果结果小于350,需先向Bottiglia表补充足够的tipo_bottiglia='vino'的记录。
修复方案:批量插入替代循环
放弃原循环插入的方式,改用批量随机选取+插入,既能避免重复,又提升效率。
1. 插入175条红葡萄酒数据
INSERT INTO vino (codice, tipo_vino, vitigno) SELECT b.codice, 'rosso' AS tipo_vino, -- 从指定10种红葡萄品种中随机选取 ELT(FLOOR(1 + (RAND() * 10)), 'Sangiovese', 'Cabernet Sauvignon', 'Merlot', 'Pinot Noir', 'Nebbiolo', 'Barbera', 'Montepulciano', 'Aglianico', 'Syrah', 'Zinfandel' ) AS vitigno FROM Bottiglia b WHERE b.tipo_bottiglia='vino' ORDER BY RAND() -- 随机排序 LIMIT 175; -- 取前175条不重复记录
2. 插入175条白葡萄酒数据
INSERT INTO vino (codice, tipo_vino, vitigno) SELECT b.codice, 'bianco' AS tipo_vino, -- 从指定9种白葡萄品种中随机选取 ELT(FLOOR(1 + (RAND() * 9)), 'Chardonnay', 'Sauvignon Blanc', 'Pinot Grigio', 'Riesling', 'Vermentino', 'Trebbiano', 'Garganega', 'Fiano', 'Verdicchio' ) AS vitigno FROM Bottiglia b WHERE b.tipo_bottiglia='vino' -- 排除已插入红葡萄酒的codice,避免重复 AND b.codice NOT IN (SELECT codice FROM vino WHERE tipo_vino='rosso') ORDER BY RAND() LIMIT 175;
说明
- 批量插入通过
ORDER BY RAND()+LIMIT保证选取的codice不重复,且NOT IN子句确保红白葡萄酒的codice完全不重叠。 - 如果
Bottiglia表中符合条件的记录数≥350,执行以上两条语句后,vino表会精确插入350条符合要求的数据。
内容的提问来源于stack exchange,提问作者GB99
相关产品推荐
相关产品推荐

