MySQL将同表不同Team Id的记录分列插入新表问题
解决MySQL插入数据时的记录重复问题
问题原因
你现在的两次INSERT操作是分别向表中插入6条仅包含team 1的记录,再插入6条仅包含team 2的记录,数据库会把这12条记录当成独立的条目存储,自然就和你想要的“一一对应成6条记录”的预期不符了。
解决方案
因为你用的是MySQL 8.0.11,支持窗口函数,这里提供两种可靠的解决方法,你可以根据原表的结构选择:
方法1:用行号关联两组数据(适合无明确关联字段的情况)
如果afc first round表中Team=1和Team=2的记录是按顺序一一对应的(比如第1条Team1对应第1条Team2),可以用ROW_NUMBER()窗口函数给每组记录标记行号,再通过行号配对插入:
-- 先清空错误的12条记录(如果需要的话) TRUNCATE TABLE `afc first round rezultate`; -- 插入正确的6条配对记录 INSERT INTO `afc first round rezultate`(`team 1`, `team 2`) SELECT t1.Country, t2.Country FROM ( SELECT Country, ROW_NUMBER() OVER () AS row_num FROM `afc first round` WHERE Team = 1 ) t1 INNER JOIN ( SELECT Country, ROW_NUMBER() OVER () AS row_num FROM `afc first round` WHERE Team = 2 ) t2 ON t1.row_num = t2.row_num;
注意:如果原表有明确的排序依据(比如分组字段、比赛时间),建议在ROW_NUMBER() OVER ()里加上ORDER BY,比如ROW_NUMBER() OVER (ORDER BY GroupID, MatchDate),这样能确保配对的准确性。
方法2:用原表的关联字段配对(优先推荐)
如果afc first round表中有共同的标识字段(比如每个对阵的MatchID、GroupID,每个标识下对应Team=1和Team=2各一条记录),直接用这个字段关联会更准确:
-- 先清空错误记录 TRUNCATE TABLE `afc first round rezultate`; -- 插入配对记录 INSERT INTO `afc first round rezultate`(`team 1`, `team 2`) SELECT t1.Country, t2.Country FROM `afc first round` t1 INNER JOIN `afc first round` t2 ON t1.MatchID = t2.MatchID -- 这里替换成你实际的关联字段 WHERE t1.Team = 1 AND t2.Team = 2;
验证执行
执行完上面的SQL后,你可以用查询语句确认结果:
SELECT * FROM `afc first round rezultate`;
应该会得到6条记录,每条都同时包含对应的team 1和team 2的Country值。
内容的提问来源于stack exchange,提问作者Marinică Alex
相关产品推荐
相关产品推荐

