最佳实践

Halo数据库MySQL模式的跨库查询

D
DBA 团队
2023年10月26日

在PostgreSQL数据库中,如果要跨库查询,一般的方式是先要在对应的数据库上建立一个dblink,然后在查询时定义后查询参数才能查到数据。而在MySQL数据库中,跨库查询比较简单,同服务器的跨库查询只需要在关联查询的时候带上数据名,SQL的写法是这样的 :

sql
select * from db1.tb1 t1 join db2.tb2 t2 on t1.a1= t2.a2;

Halo数据库的MySQL模式(以下简称Halo-MySQL)也兼容了MySQL数据库的该项功能。

需求:数据库halo_mysql_test_db的表t0需要关联数据库halo_mysql_test_db1中的t1,查询需要的数据。

# Halo-MySQL DDL语句的数据库参数

ini
postgresql_host = "127.0.0.1"
postgresql_port = 19233
postgresql_user = "halo_mysql_test_user1"
postgresql_db = "halo_mysql_test_db"

# Halo-MySQL 参数

ini
halo_mysql_host = "127.0.0.1"
halo_mysql_port = 3307
halo_mysql_user = "halo_mysql_test_user1"
halo_mysql_password = "1234wjj"
halo_mysql_db = "halo_mysql_test_db"

在建表库上执行,

sql
CREATE SCHEMA halo_mysql_test_db;
CREATE SCHEMA halo_mysql_test_db1;
SET SEARCH_PATH TO halo_mysql_test_db1, "$user", public;
CREATE TABLE halo_mysql_test_db1.t1 (
    id int,
  ident_no VARCHAR(32) NOT NULL,
    name VARCHAR(64) NOT NULL, 
  age INT NOT NULL,
  tel_no CHAR(32),
    description VARCHAR(256)
);

在Halo-MySQL库上执行:

sql
INSERT INTO halo_mysql_test_db1.t1 VALUES(1, '202201010001', 'zhangsan1', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db1.t1(id, ident_no, name, age, tel_no, description) VALUES(2, '202201010002', 'zhangsan2', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db1.t1 VALUES(3, '202201010003', 'zhangsan3', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db1.t1(id, ident_no, name, age, tel_no, description) VALUES(4, '202201010004', 'zhangsan4', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db1.t1(id, ident_no, name, age, tel_no, description) VALUES(5, '202201010004', 'zhangsan4', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db1.t1(id, ident_no, name, age, tel_no, description) VALUES(6, '202201010004', 'zhangsan4', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db1.t1(id, ident_no, name, age, tel_no, description) VALUES(9, '202201010004', 'zhangsan4', 19, '15812345678', '');
SELECT count(*) as c FROM halo_mysql_test_db1.t1;

在建表库上执行:

sql
SET SEARCH_PATH TO halo_mysql_test_db, "$user", public;
CREATE TABLE halo_mysql_test_db.t0 (
    id int,
  ident_no VARCHAR(32) NOT NULL,
    name VARCHAR(64) NOT NULL, 
  age INT NOT NULL,
  tel_no CHAR(32),
    description VARCHAR(256)
);

在Halo-MySQL库上执行:

sql
INSERT INTO t0 VALUES(1, '202201010001', 'zhangsan1', 18, '15812345678', '');
INSERT INTO t0(id, ident_no, name, age, tel_no, description) VALUES(2, '202201010002', 'zhangsan2', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db.t0 VALUES(3, '202201010003', 'zhangsan3', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db.t0(id, ident_no, name, age, tel_no, description) VALUES(4, '202201010004', 'zhangsan4', 18, '15812345678', '');
INSERT INTO t0(id, ident_no, name, age, tel_no, description) VALUES(5, '202201010004', 'zhangsan4', 18, '15812345678', '');
INSERT INTO halo_mysql_test_db.t0(id, ident_no, name, age, tel_no, description) VALUES(6, '202201010004', 'zhangsan4', 18, '15812345678', '');
SELECT count(*) as c FROM t0;
SELECT count(*) as c FROM halo_mysql_test_db.t0;
select * from t0;
select * from t1;
select * from halo_mysql_test_db1.t1;
select count(*) as c FROM halo_mysql_test_db1.t1;
select * from t0  join halo_mysql_test_db1.t1 t1 where t0.id =t1.id;

当有存量业务数据,并且存在跨库查询时,将存量业务数据导入到Halo-MySQL的时候,需要在Halo-MySQL下为原来存量业务数据在MySQL下的每个database,在Halo-MySQL上创建一个同名scheme,然后,依次为原MySQL各个database下的表,在Halo-MySQL上刚创建的同名scheme下创建表即可。

以上就是Halo-MySQL跨库查询的全部内容。感谢阅读。


最新文章

安全公告
2025年04月11日

羲和(Halo)数据库关键补丁更新公告 - 2025年4月

安全公告
2024年06月20日

羲和(Halo)数据库关键补丁更新公告 - 2024年6月

安全公告
2023年12月18日

羲和(Halo)数据库关键补丁更新公告 - 2023年12月