mysql和oracle兼容问题记录
检查表是否存在,存在则删除
mysql
drop table if exists table_name;
oracle
DECLARE
num NUMBER;
BEGIN
SELECT COUNT(1)
INTO num
FROM USER_TABLES
WHERE TABLE_NAME = UPPER('table_name');
IF num > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE table_name';
END IF;
END;
oracle不存在exists函数,所以需要先通过查询去判断表是否存在
建表,常用字段对应关系
mysql | oracle |
---|---|
varchar(60) | varchar2(60) |
TINYINT(-128-127) | TINYINT可以用NUMBER(3,0)代替 |
SMALLINT(-32768-32767) | SMALLINT可以用NUMBER(5,0)代替 |
MEDIUMINT(-8388608-8388607) | MEDUIMINT可以用NUMBER(7,0)代替 |
INT(-2147483648-2147483647) | INT可以用NUMBER(10,0)代替 |
BIGINT(-9223372036854775808-9223372036854775807) | BIGINT可以用NUMBER(20,0)代替 |
DATE,只存储日期,没有时间, | DATE类型可表示日期和时间,支持范围是[-4712-01-01 00:00:00]至[9999-12-31 23:59:59] |
TIME,只存储时间,没有日期,支持范围是[-838:59:59]至[838:59:59] | 同上 |
DATETIME,可表示日期和时间,支持范围是[1000-01-01 00:00:00]至[9999-12-31 23:59:59] | 同上 |
TIMESTAMP,可表示日期和时间 | TIMESTAMP[0-9]当小数秒精度为0时与DATE类型相同,小数秒最高精度可达9位 |
group by语句:
例子:
SELECT type, event_id, MAX(create_time) AS create_time, COUNT(*) AS accountCnt FROM table_name WHERE type='aaa' GROUP BY event_id;
低版本mysql执行上述语句没有问题,高版本默认设置了only_full_group_by,所以执行后出现报错:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cmxt_log.table_name.type' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
oracle执行上述语句会出现报错:
ORA-00979: 不是 GROUP BY 表达式
原因为select后面除了聚合函数之外的列没有全部在group by中
解决方案
mysql可以在type前添加ANY_VALUE函数避免该问题,或者在mysql的配置中修改sql_mode,去除only_full_group_by属性。
oracle高版本支持该函数,低版本不支持,只能根据实际情况修改SQL语句解决,可以使用嵌套查询,或将type和event_id同时进行group by操作。
oracle和mysql保留字问题
建表过程中需要避免将字段设置成oracle和mysql的保留字,比如uid在mysql中可以正常使用,但在oracle中是关键字,不能正常使用,必须加上双引号才行。
例如:
select uid from table_name;
查询结果会有问题,必须使用select “uid” from table_name;才能正常查询