跨Schema
概念说明:
- Schema:DRDS实例中的一个数据库,它可能是一个带水平拆分的库,也可能是没做水平拆分的库
- SchemaName:DRDS数据库库名,通常在一个实例内唯一
- Table: DRDS数据库中一个表,它可能是一张带水平拆分的表,也可能是没做水平拆分的表
- TableName: DRDS数据库中一个表的表名,通常在一个Schema内唯一
版本要求:
- 必须是 5.3.8-15517870 及其以上版本
- 使用跨Schema查询前,务必先做好相关的Schema的访问授权,授权相关的语法请参考 账号和权限系统
使用说明
DRDS实例中通常有多个Schema。DRDS支持通过SQL语法进行跨Schema的查询,效果与MySQL的跨Schema查询类似。
在DRDS中,若要使用跨Schema的查询语法,需要在写SQL语句时为具体的 TableName 增加其对应的 SchemaName 的前缀(例如,xxx_tbl
-> yyy_db
.xxx_tbl
), 从而指定表xxx_tbl
所属的Schema。这与MySQL的跨Schema查询的语法完全兼容。
使用示例
假设 new_db
、trade_db
与 user_db
分别是同一DRDS实例中3个不同的Schema,其中 new_tbl
、trade_tbl
与 user_tbl
3个Table分别属于new_db
、trade_db
与 user_db
3个Schema,并且new_tbl
、trade_tbl
与 user_tbl
这3个Table分别有对应的3个Sequence AUTO_SEQ_new_tbl
、AUTO_SEQ_trade_tbl
与 AUTO_SEQ_user_tbl
。假设当前用户登录DRDS使用的SchemaName是trade_db
。
跨Schema的使用示例1——Select
若要完成
trade_tbl
与user_tbl
之间的跨Schema关联聚合查询,可以使用以下的SQL: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的使用示例2——Insert
若用户需要数据插入到
new_db
库中new_tbl
表中,可以使用以下的SQL:INSERT INTO `new_db`.`new_tbl` (user_id, title) VALUES ( null, 'test' );
跨Schema的使用示例3——分布式事务
假设用户想在分布式事务中,分别对表
new_tbl
与表user_tbl
进行更新或删除,并合并提交,可以使用以下的SQL: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的使用示例4——Sequence
若用户要显式使用Sequence进行跨Schema的INSERT操作,需要在显式地在Sequence名字前边加上SchemaName的前缀(如
xxx_seq
->yyy_db
.xxx_seq
),以指定Sequence所属的Schema,例如:/* 该 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的使用示例5——ShowCreateTable
若用户需要在当前的Schema,去查询其它Schema(如
new_db
)的建表语句,可以使用以下的SQL:SHOW CREATE TABLE `new_db`.`new_tbl`;
支持跨Schema查询的SQL类型
- SELECT 语句,详细语法请参考 SELECT
- INSERT 语句,详细语法请参考 INSERT
- REPLACE 语句,详细语法请参考 REPLACE
- UPDATE 语句,详细语法请参考 UPDATE
- DELETE 语句,详细语法请参考 DELETE
- 分布式事务,详细语法请参考 分布式事务
- Sequence,详细语法请参考 Sequence
- DAL,详细语法请参考 DAL
- USE 语句,详细语法请参考 USE
注意点
- 不支持 Create / Alter / Drop Sequence语句的跨Schema用法
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论