1.mysql与gaussdb的差异比对:
Mysql 分布式Gauss DB 100
1)YEAR(CURRENT_TIMESTAMP()) year =》 EXTRACT (year from current_timestamp ()) year
2)((#{year} - 1) + '0101000000') =》 to_date((#{year} - 1)||'-01-01','%Y-mm-%d')
3)((#{year} - 1)+'1231235959') =》 to_date((#{year} - 1)||'-12-31 23:59:59','%Y-mm-%d %H:%i:%s')
4)CEILING =》 CEIL
5) 字段如果有not null约束,mysql中可以插入‘’/ ' ',在gauss中只能插入' '
6)导入数据时 mysql 0000-00-00 =》 gauss 0001-01-01
7)DateFormat =》 视具体情况替换成to_char 或者 to_date
8)STR_TO_DATE =》 to_date
9) group by 的list 中必须要有select中的字段
10)日期格式 :%M =》 日期格式 : mm
11)ON DUPLICATE KEY UPDATE 支持子查询 =》 分布式情况下,不支持子查询,另外merge功能也不支持子查询 ---后通过merge实现
12)integer格式能隐式转成date =》 需要to_date函数转换
13)Decimal(x,y)/Number/Double/float 精度处理差异:
1)如果在sql中直接将查询结果设置为0(0.00)(不从数据库字段中取值),则mysql统一处理为0.00,gaussdb统一处理为0
2)如果在sql中直接将查询结果设置为2(2.00)(不从数据库字段中取值),则mysql统一处理为2.00,gaussdb统一处理为2
例子:
select 0 as alias from table 的结果: =》 select 0 as alias from table 的结果:
0.00 0
select 0.01 as alias from table 的结果: =》 select 0.01 as alias from table 的结果:
0.01 0.01
3)计算结果的精度处理:
A(Decimal(16,2)) :1.00 ,B(Decimal(16,2)) :1.00 => A(Decimal(16,2)) :1.00 ,B(Decimal(16,2)) :1.00
A+B =2.00 A+B =2
PERIOD_ADD =》 add_mouths
DATE_ADD =》 timestampadd
SIGNED integer =》 integer SIGNED
2.建库/表/索引差异:
分库分表语法修改:
分片:
dbpartition by hash(`MDTRTPROV_DBPT_CODG`) =》DISTRIBUTE BY HASH (MDTRTPROV_DBPT_CODG) 且 分片字段必须是主键
分区:
tbpartition by hash(`MSGID`) tbpartitions 3 =》 PARTITION BY HASH (MSGID) PARTITIONS 3
索引:
KEY `auto_shard_key_mdtrtprov_dbpt_codg` (`MDTRTPROV_DBPT_CODG`) USING BTREE -》 默认B+
KEY `INDEX_senderMsgId` (`SENDER_MSG_ID`) =》需要单独创建索引,create index
=》普通表在分布式下必须要指定分片(复制表):distribute by replication on groupid(1)
3.Gaussdb的语法限制:
1)ORDER BY 要用as的别名,不能用原字段名
2)group by 要用原字段名称,不能用as的名称
3)字段用到关键字,如date,需要加上反引号`
4.一些常见的问题:
如果遇到查询关闭数据库socket连接,可以试试调整where条件顺序,将有传参的条件放到固定条件之前, 将CURRENT_TIMESTAMP()函数换成sysdate
那我想将两张相同字段的表进行合并,如果主键重复就做更新操作,主键不冲突就插入,gauss该用什么语句呢
DataStudio工具,格式化后很多sql执行会报错。
When Case 中有now()函数导致执行报错,可以更换为sysdate