一般 MySQL 的关联查询都是在同一个数据库内,那如果要和不同的数据库进行关联查询,可以使用 MySQL 中的 FEDERATED 引擎,那什么是 FEDERATED 引擎
图片来自 MySQL 官方文档
如图,FEDERATED 引擎的原理为:
- 远程服务器开启 FEDERATED 引擎支持
- 本地服务器查询 FEDERATED 引擎表时,会发送查询语句到远程服务器
- 远程服务器通过传过来的查询语句,查询出结果,返回给本地调用服务器
接下来以 Windows 系统为例,首先可以查看下本地数据库服务对 FEDERATED 引擎是否支持,使用下面命令
SHOW ENGINES;
结果如下
可以看到默认是不支持的,这时可以修改启动配置文件 my.ini,在 [mysqld] 组增加 federated,然后重启服务,使数据库服务支持 FEDERATED 引擎,重启后结果如下
然后在本地数据库实例上新建两个数据库 remote (模拟远程数据库)和 local(模拟本地数据库),并在 remote 和 local 数据库新建测试表和测试数据
然后我们可以在 local 数据库中创建 t_remote 的 FEDERATED 引擎表
CREATE TABLE `t_remote` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key1` varchar(10) DEFAULT NULL,
`key2` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
)
ENGINE = FEDERATED
COMMENT='远程表' CONNECTION='mysql://root:123456@localhost:3306/remote/t_remote';
执行完结果如下
可以看到 local 数据库中的 t_remote 表和 remote 数据库中的 t_remote 表数据库一样,这样就可以做关联查询了
如上,实现 MySQL 跨库关联查询。
附:CONNECTION 还可以使用另外一种方式
CREATE TABLE `engin_sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`username` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
`password` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
`state` int(4) DEFAULT NULL COMMENT '状态,1正常,0待审核,-1删除',
`createtime` datetime DEFAULT NULL COMMENT '创建时间',
`operatortime` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=FEDERATED AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CONNECTION='mysql://username:password@xxx.xxx.xxx.2:port/db/table'
另外,CONNECTION 还可以使用另外一种方式 (需要注意的是 SERVER , WRAPPER):
CREATE SERVER server_dz
FOREIGN DATA WRAPPER mysql
OPTIONS (HOST 'xxx.xxx.xxx.2',USER 'xxx',PASSWORD 'xxx' ,PORT 3306,DATABASE 'db');
执行后,建表语句中可以使用:CONNECTION='server_dz', 需要注意的是表名,要和 db1 中的保持一致
测试效果如下:
修改 db1 中 sys_user 的表数据后,再 db2 查看 engin_sys_user 的表数据,结果如下图: