PolarDB-X 1.0实例中通常有多个Schema,PolarDB-X 1.0支持通过SQL语法进行跨Schema的查询,效果与MySQL的跨Schema查询类似。
注意事项
- 若要使用跨Schema的查询语法,需要在写SQL语句时为具体的TableName增加其对应的SchemaName的前缀(如
xxx_tbl
->yyy_db
.xxx_tbl
),从而指定表xxx_tbl
所属的Schema。这与MySQL的跨Schema查询的语法完全兼容。 - 不支持CREATE、ALTER、DROP SEQUENCE语句的跨Schema用法。
- PolarDB-X 1.0实例需为5.3.8-15517870或以上版本。
- 使用跨Schema查询前,请先完成Schema的访问授权,授权相关的语法请参见账号和权限系统。
基本概念
- Schema:PolarDB-X 1.0实例中的一个数据库,它可能是一个带水平拆分的库,也可能是没做水平拆分的库。
- SchemaName:PolarDB-X 1.0数据库库名,同一个实例内的数据库库名具有唯一性。
- Table: PolarDB-X 1.0数据库中的一张表,它可能是一张带水平拆分的表,也可能是没做水平拆分的表。
- TableName: PolarDB-X 1.0数据库中一张表的表名,同一个数据库内的表名具有唯一性。
使用示例
假设在某一PolarDB-X 1.0实例中,您创建了3个不同的数据库,每个数据库内分别有一张表,且每张表均有各自对应的Sequence,各个数据库、表和Sequence的详情如下所示:
SchemaName | TableName | Sequence |
---|---|---|
new_db |
new_tbl |
AUTO_SEQ_new_tbl |
trade_db |
trade_tbl |
AUTO_SEQ_trade_tbl |
user_db |
user_tbl |
AUTO_SEQ_user_tbl |
假设您当前登录控制台使用的SchemaName为trade_db
,则您可以使用如下SQL语句进行跨Schema查询:
- 跨Schema的使用示例(SELECT)
您可以使用如下SQL在
trade_tbl
与user_tbl
数据库间进行跨Schema关联聚合查询:SELECT COUNT(DISTINCT u.user_id) FROM `trade_tbl` AS t INNER JOIN `user_db`.`user_tbl` AS u ON t.user_id=u.user_id WHERE u.user_id >= 10000 GROUP BY t.title
- 跨Schema的使用示例(INSERT)
您可以使用如下SQL语句,将数据插入到
new_db
库中new_tbl
表中:INSERT INTO `new_db`.`new_tbl` (user_id, title) VALUES ( null, 'test' );
- 跨Schema的使用示例3(分布式事务)
在分布式事务中,您可以使用如下SQL语句,分别对表
new_tbl
与表user_tbl
进行更新或删除,并合并提交:SET AUTOCOMMIT=off; SET drds_transaction_policy = 'XA'; UPDATE `new_db`.`new_tbl` SET name='abc' WHERE use_id=1; DELETE FROM `user_db`.`user_tbl` WHERE user_id=2; COMMIT;
- 跨Schema的使用示例(SEQUENCE)
若要显式使用Sequence进行跨Schema的INSERT操作,则您需要先在显式Sequence名字前加上SchemaName的前缀(如
xxx_seq
->yyy_db
.xxx_seq
/* 该 SQL将使用`new_db`库的`AUTO_SEQ_new_tbl`作为Sequence并进行插入操作 */ INSERT INTO `new_db`.`new_tbl` (id, name) values ( null, 'test_seq' );
/* 该 SQL将使用`new_db`库的`AUTO_SEQ_new_tbl`作为Sequence进行插入操作,注意这里的Sequence指定了SchemaName */ INSERT INTO `new_db`.`new_tbl` (id, name) values ( `new_db`.AUTO_SEQ_new_tbl.nextval, 'test_seq' );
- 跨Schema的使用示例(SHOW CREATE TABLE)
您可以使用如下SQL语句在当前Schema中去查询其它Schema(如
new_db
SHOW CREATE TABLE `new_db`.`new_tbl`;