如何从其他MySQL数据库向C_DB.prvn表插入数据并修正SQL语句
修正跨数据库INSERT INTO的执行错误
看起来你在跨数据库插入数据时遇到了两个关键问题:语法错误和ID计算逻辑不符合预期。我来帮你一步步解决:
现有数据库表数据
A_DB.prvn
id (PK, A_I) | dm | Name ------------|------|------ 1 | 1001 | David 2 | 1001 | Sam
B_DB.prvn
id (PK, A_I) | dm | Name ------------|------|------ 1 | 1002 | Bird 2 | 1002 | Cat
期望的C_DB.prvn结果
id | dm | Name -----|------|------ 10011| 1001 | David 10012| 1001 | Sam 10021| 1002 | Bird 10022| 1002 | Cat
你的代码存在的问题
- 语法错误:当使用
INSERT INTO结合SELECT查询批量插入数据时,不需要VALUES关键字。VALUES仅适用于插入明确指定的单个/多个值(如VALUES (1, 'a'), (2, 'b')),正确写法是直接使用INSERT INTO ... SELECT ...。 - ID计算逻辑错误:你使用
dm + id会执行数值加法(例如1001+1=1002),但你需要的是将dm与id拼接成新的ID(1001拼接1得到10011)。可以用字符串拼接后转数值的方式,或者如果id始终是个位数,用dm * 10 + id也能实现需求。
修正后的代码
-- 从A_DB插入数据到C_DB INSERT INTO C_DB.prvn (id, dm, Name) SELECT CAST(CONCAT(dm, id) AS UNSIGNED) AS new_id, dm, Name FROM A_DB.prvn WHERE CAST(CONCAT(dm, id) AS UNSIGNED) NOT IN (SELECT id FROM C_DB.prvn); -- 从B_DB插入数据到C_DB INSERT INTO C_DB.prvn (id, dm, Name) SELECT CAST(CONCAT(dm, id) AS UNSIGNED) AS new_id, dm, Name FROM B_DB.prvn WHERE CAST(CONCAT(dm, id) AS UNSIGNED) NOT IN (SELECT id FROM C_DB.prvn);
补充说明
- 如果你的
id字段永远是个位数,使用dm * 10 + id会比字符串拼接更高效,例如1001*10+1=10011,结果和字符串拼接完全一致。 - 保留了你原本的
NOT IN判断逻辑,可以有效避免重复插入已存在的数据。
内容的提问来源于stack exchange,提问作者S R R
相关产品推荐
相关产品推荐

