You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:02:32