MySQL多对多关联表插入问题:用MAX()与关联查询插入数据
解决多对多关联表插入时searchword_id为NULL的问题
我来帮你搞定这个问题!你的SQL语句里第二个子查询的逻辑出了问题,才导致searchword_id总是返回NULL,咱们一步步拆解来看:
问题根源分析
你当前用来查询searchword_id的子查询是这样的:
SELECT DISTINCT searchwords.searchword_id FROM searchwords INNER JOIN join_table ON searchwords.searchword_id = join_table.searchword_id WHERE searchword = "oranges"
这里错误地用了INNER JOIN join_table,但你的join_table现有数据里searchword_id全是NULL,根本没法和searchwords表中有效的searchword_id(1-5)匹配上,所以这个子查询会返回空结果,最终导致插入时searchword_id被设为NULL。
修正后的SQL语句
其实你完全不需要关联join_table,直接从searchwords表根据关键词查询对应的searchword_id就够了——从你的表数据来看,searchword字段是唯一的,所以直接查询即可。修正后的插入语句如下:
INSERT INTO join_table (pm_id, searchword_id) SELECT (SELECT MAX(pm_id) FROM pm), (SELECT searchword_id FROM searchwords WHERE searchword = "oranges");
额外优化建议
如果你的场景是刚向pm表插入了一条新数据,紧接着就要插入关联记录,那用MAX(pm_id)在高并发场景下可能会有问题(比如同时有其他会话插入pm数据),这时候更推荐用964353来获取当前会话刚插入的pm_id:
-- 先执行pm表的插入操作:INSERT INTO pm (...) VALUES (...); INSERT INTO join_table (pm_id, searchword_id) SELECT 964353, (SELECT searchword_id FROM searchwords WHERE searchword = "oranges");
这样就能确保每次插入的pm_id和searchword_id都是准确的啦!
内容的提问来源于stack exchange,提问作者Swede
相关产品推荐
相关产品推荐

