天天看點

MyCat 之路 | 不支援的SQL語句總結

SELECT:

  • 跨分片(實體庫)的交叉查詢
  • 跨節點的聯合查詢 (如使用者庫的表和平台庫的表做聯合查詢)

INSERT:

  • 插入的字段不包含分片字段 (如插入tbl_user_base_info表,沒有提供user_id列)
  • 插入的分片字段找不到對應分片
  • 複制插入:

    Insert into…select…

  • 多行插入:

    insert into tab_a(c1,c2) values(v1,v2),(v11,v21)…

UPDATE:

  • 更新的列包含分片列
  • 多表更新:

    update a, b set a.nation='China', b.pwd='123456' where a.id=b.id;

  • 複雜更新:

    update a, b set a.nation='China' where a.id=b.id

    ; 但支援子查詢方式

    update a set a.nation='China' where id in (select id from b)

    ;

DELETE:

  • 複雜删除:

    delete a from a join b on a.id=b.id;

  • 支援子查詢方式:

    delete from a where a.id in (select id from b)

    , 但表不能起别名

其它:

  • Call procedure()

    :MyCat未支援存儲過程定義, 因而不允許調用存儲過程,但可通過注解來調用各個分片上的存儲過程
  • Select func()

    :不支援這種方式直接調用自定義函數,但支援

    select id, func() from employee

    ,隻需employee所在的所有分片上存在這個函數。MySql自帶函數可随意使用。

注意事項:

  • Order by

    字段必須出現在select中(MyCat先将結果取出,然後排序);
  • Group by

    務必使用标準文法select count(1),type from tab_a group by type;
  • MyCat的一些自帶函數sum,min,max等可以正确使用,但多分片執行的avg有bug,執行的結果是錯誤的謹慎使用子查詢,外層查詢沒有分片查詢條件,則會在所有分片上執行(子查詢内外層的表一樣較為特殊)。

繼續閱讀