以下大部分内容非原创,整理自阿里云官方文档
SQL大类限制
- 暂不支持用户自定义数据类型、自定义函数。
- 暂不支持视图、存储过程、触发器、游标。
- 暂不支持 BEGIN…END、LOOP…END LOOP、REPEAT…UNTIL…END REPEAT、WHILE…DO…END WHILE 等复合语句。
- 暂不支类似 IF ,WHILE 等流程控制类语句。
DDL限制
- CREATE TABLE tbl_name LIKE old_tbl_name 不支持拆分表。
- CREATE TABLE tbl_name SELECT statement 不支持拆分表。
数据库管理限制
- SHOW WARNINGS Syntax 不支持 LIMIT/COUNT 的组合。
- SHOW ERRORS Syntax 不支持 LIMIT/COUNT 的组合。
DML限制
- 暂不支持 SELECT INTO OUTFILE/INTO DUMPFILE/INTO var_name。
- 暂不支持 INSERT DELAYED Syntax。
- 暂不支持非 WHERE 条件的 Correlate Subquery。
- 暂不支持 SQL 中带聚合条件的 Correlate Subquery。
- 暂不支持 SQL 中对于变量的引用和操作,比如 SET @c=1, @d=@c+1; SELECT @c, @d。
关于 Correlated Subquery 的解释:
Correlated Subquery is a sub-query that uses values from the outer query. In this case the inner query has to be executed for every row of outer query.
See example here http://en.wikipedia.org/wiki/Correlated_subquery
Simple subquery doesn’t use values from the outer query and is being calculated only once:
1 | SELECT id, first_name |
分析
DDL限制、数据库管理限制,由于与应用关系不大,编码时无须特别关心。
SQL大类限制,如视图、存储过程、触发器、游标等,通常是不被提倡的坏味道,如果有的话,直接改方式实现即可。
DML限制,需要特别注意。如果使用ORM,应该不会有太大问题,但用jdbcTemplate写原生SQL的话(如实时报表类的功能点)有可能会踩坑。
另外默认不支持跨实例事务,私有云貌似也没有GTS选项,需要在代码层面进行优化。
DML错误示例
1 | select * from (select id,name from normal_tables) t |
[b8040ac9f401000][192.168.2.47:3306][dev_sc_dmanage]ERR-CODE: [TDDL-4007][ERR_CANNOT_FETCH_TABLE_META] Table ‘normal_tables’ metadata cannot be fetched because Table ‘dev_sc_dmanage_ssiu_0000.normal_tables’ doesn’t exist. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4007]
1 | select a,*,b.* from shard_table a |
[b80405010801000][192.168.2.47:3306][dev_sc_dmanage]column: a is not existed in either null or select clause
1 | select a,*,b.* from normal_tables a |
[b8040692c001000][192.168.2.47:3306][dev_sc_dmanage]ERR-CODE: [TDDL-4007][ERR_CANNOT_FETCH_TABLE_META] Table ‘normal_tables’ metadata cannot be fetched because Table ‘dev_sc_dmanage_ssiu_0000.normal_tables’ doesn’t exist. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4007]
1 | insert into group_seq_tbl (name) values ('hello'); |
[b807dfe12c01000-24][192.168.2.47:3306][dev_sc_dmanage]ERR-CODE: [TDDL-4603][ERR_ACCROSS_DB_TRANSACTION] Transaction accross db is not supported in current transaction policy, transaction node is: DEV_SC_DMANAGE_1501040729564NYQSDEV_SC_DMANAGE_SSIU_0003_RDS, but this sql execute on: DEV_SC_DMANAGE_1501040729564NYQSDEV_SC_DMANAGE_SSIU_0006_RDS. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4603]