全部产品
云市场

跨Schema

更新时间:2019-03-08 21:51:01

概念说明:

  • 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_dbtrade_dbuser_db 分别是同一DRDS实例中3个不同的Schema,其中 new_tbltrade_tbluser_tbl 3个Table分别属于new_dbtrade_dbuser_db 3个Schema,并且new_tbltrade_tbluser_tbl 这3个Table分别有对应的3个Sequence AUTO_SEQ_new_tblAUTO_SEQ_trade_tblAUTO_SEQ_user_tbl。假设当前用户登录DRDS使用的SchemaName是trade_db

  • 跨Schema的使用示例1——Select

    若要完成 trade_tbluser_tbl 之间的跨Schema关联聚合查询,可以使用以下的SQL:

    1. SELECT COUNT(DISTINCT u.user_id)
    2. FROM `trade_tbl` AS t
    3. INNER JOIN `user_db`.`user_tbl` AS u ON t.user_id=u.user_id
    4. WHERE u.user_id >= 10000
    5. GROUP BY t.title
  • 跨Schema的使用示例2——Insert

    若用户需要数据插入到new_db库中new_tbl表中,可以使用以下的SQL:

    1. INSERT INTO `new_db`.`new_tbl` (user_id, title) VALUES ( null, 'test' );
  • 跨Schema的使用示例3——分布式事务

    假设用户想在分布式事务中,分别对表new_tbl与表user_tbl进行更新或删除,并合并提交,可以使用以下的SQL:

    1. SET AUTOCOMMIT=off;
    2. SET drds_transaction_policy = 'XA';
    3. UPDATE `new_db`.`new_tbl` SET name='abc' WHERE use_id=1;
    4. DELETE FROM `user_db`.`user_tbl` WHERE user_id=2;
    5. COMMIT;
  • 跨Schema的使用示例4——Sequence

    若用户要显式使用Sequence进行跨Schema的INSERT操作,需要在显式地在Sequence名字前边加上SchemaName的前缀(如xxx_seq -> yyy_db.xxx_seq),以指定Sequence所属的Schema,例如:

    1. /* 该 SQL将使用`new_db`库的`AUTO_SEQ_new_tbl`作为Sequence并进行插入操作 */
    2. INSERT INTO `new_db`.`new_tbl` (id, name) values ( null, 'test_seq' );
    1. /* 该 SQL将使用`new_db`库的`AUTO_SEQ_new_tbl`作为Sequence进行插入操作,注意这里的Sequence指定了SchemaName */
    2. 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:

    1. 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

注意点

  • 不支持跨Schema的DDL语句
  • 不支持 Create / Alter / Drop Sequence语句的跨Schema用法