在PostgreSQL数据库中,如果要跨库查询,一般的方式是先要在对应的数据库上建立一个dblink,然后在查询时定义后查询参数才能查到数据。而在MySQL数据库中,跨库查询比较简单,同服务器的跨库查询只需要在关联查询的时候带上数据名,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语句的数据库参数
postgresql_host = "127.0.0.1"
postgresql_port = 19233
postgresql_user = "halo_mysql_test_user1"
postgresql_db = "halo_mysql_test_db"
# Halo-MySQL 参数
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"
在建表库上执行,
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库上执行:
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;
复制
在建表库上执行:
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库上执行:
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跨库查询的全部内容。感谢阅读,祝大家双节愉快!
评论
