MySQL跨多数据库数据提取与插入操作问题咨询
先帮你梳理下核心场景:你有first、second、third三个MySQL数据库,需要把first.items和second.Shop关联后的目标数据插入到third.Details中,最终得到你想要的结构化结果。下面逐个解决你的问题:
1) 如何同时连接三个数据库?
完全不需要创建3个单独的PHP连接文件!如果这三个数据库在同一台MySQL服务器上,且你的PHP连接账号拥有三个库的访问权限,只需要一个连接就足够了。连接成功后,直接用数据库名.表名的格式就能跨库操作不同表。
给你举个PHP mysqli的示例:
// 单个连接即可访问所有三个库 $conn = new mysqli('localhost', '你的用户名', '你的密码'); // 检查连接状态 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); }
之后执行SQL时,直接写first.items、second.Shop、third.Details就能跨库调用。如果三个库在不同服务器,那才需要分别创建连接,在代码里按需切换使用。
2) 能否用SELECT * from first.items INSERT INTO third.details;复制所有字段?
这个写法语法完全错误!正确的跨库复制字段语法是INSERT ... SELECT,而且必须保证两张表的字段数量、顺序、数据类型匹配。
举个适配场景的例子:如果third.details的字段和first.items完全一致(但你的场景里显然不满足,因为Details多了shop名称字段),正确写法是:
INSERT INTO third.details (id, name, price) SELECT id, name, price FROM first.items;
回到你的需求,Details表包含shop名称字段,所以不能直接复制first.items的所有字段,必须结合关联查询获取完整数据。
3) 你的SQL语句为什么没插入数据?
你的语句存在严重的语法错误:
- 单个SQL语句里不能连续写两个
SELECT INSERT ... VALUES只能传入固定值,不能直接引用其他表的字段,要插入查询结果必须用INSERT ... SELECT语法
针对你的需求,正确的SQL语句应该是这样的(注意表名字母大小写,MySQL在Linux环境下区分大小写,要和你实际表名一致):
INSERT INTO third.Details (items_id, items_name, shop_name) SELECT i.id, i.name, s.name FROM first.items i JOIN second.Shop s ON i.id = s.items_id;
如果third.Details的id字段是自增主键,你不需要手动指定它的值,数据库会自动生成(对应你想要的最终结果里的id 1、2)。执行这条语句后,就能得到你期望的Details表数据了。
内容的提问来源于stack exchange,提问作者LJ27

