PolarDB-X 1.0實(shí)例中通常有多個(gè)Schema,PolarDB-X 1.0支持通過(guò)SQL語(yǔ)法進(jìn)行跨Schema的查詢,效果與MySQL的跨Schema查詢類似。

注意事項(xiàng)

  • 若要使用跨Schema的查詢語(yǔ)法,需要在寫SQL語(yǔ)句時(shí)為具體的TableName增加其對(duì)應(yīng)的SchemaName的前綴(如xxx_tbl -> yyy_db.xxx_tbl),從而指定表xxx_tbl所屬的Schema。這與MySQL的跨Schema查詢的語(yǔ)法完全兼容。
  • 不支持CREATE、ALTER、DROP SEQUENCE語(yǔ)句的跨Schema用法。
  • PolarDB-X 1.0實(shí)例需為5.3.8-15517870或以上版本。
  • 使用跨Schema查詢前,請(qǐng)先完成Schema的訪問(wèn)授權(quán),授權(quán)相關(guān)的語(yǔ)法請(qǐng)參見(jiàn)賬號(hào)和權(quán)限系統(tǒng)。

基本概念

  • Schema:PolarDB-X 1.0實(shí)例中的一個(gè)數(shù)據(jù)庫(kù),它可能是一個(gè)帶水平拆分的庫(kù),也可能是沒(méi)做水平拆分的庫(kù)。
  • SchemaName:PolarDB-X 1.0數(shù)據(jù)庫(kù)庫(kù)名,同一個(gè)實(shí)例內(nèi)的數(shù)據(jù)庫(kù)庫(kù)名具有唯一性。
  • Table: PolarDB-X 1.0數(shù)據(jù)庫(kù)中的一張表,它可能是一張帶水平拆分的表,也可能是沒(méi)做水平拆分的表。
  • TableName: PolarDB-X 1.0數(shù)據(jù)庫(kù)中一張表的表名,同一個(gè)數(shù)據(jù)庫(kù)內(nèi)的表名具有唯一性。

使用示例

假設(shè)在某一PolarDB-X 1.0實(shí)例中,您創(chuàng)建了3個(gè)不同的數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)內(nèi)分別有一張表,且每張表均有各自對(duì)應(yīng)的Sequence,各個(gè)數(shù)據(jù)庫(kù)、表和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

假設(shè)您當(dāng)前登錄控制臺(tái)使用的SchemaName為trade_db,則您可以使用如下SQL語(yǔ)句進(jìn)行跨Schema查詢:

  • 跨Schema的使用示例(SELECT)

    您可以使用如下SQL在 trade_tbluser_tbl數(shù)據(jù)庫(kù)間進(jìn)行跨Schema關(guān)聯(lián)聚合查詢:

    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語(yǔ)句,將數(shù)據(jù)插入到new_db庫(kù)中new_tbl表中:

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

    在分布式事務(wù)中,您可以使用如下SQL語(yǔ)句,分別對(duì)表new_tbl與表user_tbl進(jìn)行更新或刪除,并合并提交:

        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進(jìn)行跨Schema的INSERT操作,則您需要先在顯式Sequence名字前加上SchemaName的前綴(如xxx_seq -> yyy_db.xxx_seq

    /* 該 SQL將使用`new_db`庫(kù)的`AUTO_SEQ_new_tbl`作為Sequence并進(jìn)行插入操作 */
    INSERT INTO `new_db`.`new_tbl` (id, name) values ( null, 'test_seq' );
    /* 該 SQL將使用`new_db`庫(kù)的`AUTO_SEQ_new_tbl`作為Sequence進(jìn)行插入操作,注意這里的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語(yǔ)句在當(dāng)前Schema中去查詢其它Schema(如new_db

        SHOW CREATE TABLE `new_db`.`new_tbl`;

支持跨Schema查詢的SQL類型