如何使用返回多行的SELECT子查询向MySQL表插入数据?
解决MySQL插入时子查询返回多行的问题
错误原因
你遇到的Subquery returns more than 1 row错误,是因为VALUES子句里的子查询返回了多行结果——你的专辑Victorialand有CD和Vinyl两个符合releaseformat IN ('CD','V')条件的条目,对应的releaseid是两个,而VALUES要求子查询必须返回单行单列值。
解决方案
根据你的需求选择对应写法:
1. 给CD和Vinyl格式各插入一条相同曲目(一次性插入2条记录)
不需要拆成两个查询,用INSERT ... SELECT语法可以批量插入:
INSERT INTO tbl_track (trackname, trackno, tracklength, releaseid) SELECT 'Fluffy Tufts', '2', 3.6, releaseid FROM tbl_release WHERE releasename = 'Victorialand' AND releaseformat IN ('CD', 'Vinyl'); -- 注意这里确保'releaseformat'的值和表中匹配,比如你原来写的'V'如果是Vinyl的缩写,就用'V'
这条语句会自动为每个符合条件的releaseid生成一条插入记录,一次完成两条数据的插入。
2. 只插入一条曲目(对应其中一个格式的releaseid)
如果只需要插入一条,就要让子查询返回单行结果,比如明确指定格式,或者用LIMIT 1:
-- 明确指定选CD格式的releaseid INSERT INTO tbl_track (trackname, trackno, tracklength, releaseid) VALUES('Fluffy Tufts','2',3.6,(SELECT releaseid FROM tbl_release WHERE releasename = 'Victorialand' AND releaseformat = 'CD' LIMIT 1)); -- LIMIT 1确保只返回一行,避免意外
关于拆分查询的问题
不是必须拆成两个查询,用上面的INSERT ... SELECT可以更高效地完成批量插入;如果只需要单条记录,调整子查询确保返回单行即可。
内容的提问来源于stack exchange,提问作者Joao Cerca
相关产品推荐
相关产品推荐

