长期的Oracle用户切换到MySQL,任何需要注意的问题?

wis*_*ame 3 mysql sql oracle plsql

碰巧过去10年中的所有项目都是将Oracle作为数据库服务器.现在,我正在开始自己的MySQL项目(最新的稳定版).

是否存在任何陷阱(Oracle用户无法正常工作)?与事务管理,锁定,隔离级别,索引,那种东西有关.

我主要是Java开发人员,所以我对如何从应用程序服务器看到数据库感兴趣.存储过程,(复杂)视图或任何花哨的东西都不在我这个项目的雷达上.

谢谢.

OMG*_*ies 11

MySQL有各种引擎 - 主要是INNODB和MyISAM. MyISAM不支持事务,也不支持外键约束.隔离级别相似 - 这些天似乎在数据库之间相对标准.

索引

索引不同 - MySQL具有聚簇索引和非聚簇索引.聚簇索引通常用于主键,但不一定.定义索引的空间有限制 - INNODB为767,MyISAM为1,000.支持覆盖索引,不支持基于函数的索引...

优化器每个SELECT子句只能使用一个索引 - 检查EXPLAIN PLAN输出.有指定要使用的索引的语法,但它是一个提示,仍然可以被优化器忽略.

约束

MySQL具有CHECK约束语法,但当前没有引擎强制执行它.唯一的选择是使用触发器.MySQL中的唯一约束作为索引实现.

自定义错误处理

您需要为自定义错误处理声明处理程序:http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

以前 -
MySQL不支持定义自定义错误以区分数据完整性和业务规则错误.

分析/排名/窗口功能

MySQL没有任何此类功能 - 没有ROW_NUMBER,NTILE,RANK或DENSE_RANK.您可以使用变量创建伪造的功能 - 如果您检查标签"mysql","rank",那么SO上有很多示例.

WITH语法 - 子查询因子

这是MySQL没有的另一件事.

分层查询支持

你猜对了 - 没有递归支持分层查询.从v2(!!)开始,Oracle就有了CONNECT BY,但ANSI标准是使用你在SQL Server 2005+中看到的WITH子句.

查看

MySQL不支持物化视图,并且视图支持被削弱 - 例如,不能使用子查询.

PIVOT/UNPIVOT

这是ANSI标准语法; Oracle在11g开始支持,但MySQL再次不支持这一点.只有选项是CASE表达式和聚合函数,它仍然是实现此功能的最便携方式(SQL Server 2005+支持PIVOT/UNPIVOT).

序列

MySQL不支持序列,最接近的是将INT列定义为auto_increment.这使得在两个或多个表中使用相同的值序列非常困难(如果您不需要,则不是您真正想要的).此外,每个表只能定义一个auto_increment列.该增量和偏移量是实例级 -改变它,你在每一个实例提供数据库实现每一个AUTO_INCREMENT列.重置auto_increment值需要ALTER TABLE权限; 删除/截断数据不会改变当前值.

在这方面,MySQL不支持RETURNING子句. 您需要使用它LAST_INSERT_ID()来检索新创建的行的auto_increment值.

数据类型

MySQL没有NUMBER数据类型 - 它将数字分为INT,MEDIUMINT等.在这方面,MySQL与SQL Server非常相似. MySQL的TEXT(TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT)数据类型比Oracle VARCHAR2的4000限制更容易.MySQL支持CLOB和BLOB ......

包,存储过程,功能

MySQL支持用户定义的函数和存储过程 - 我还没有遇到支持类似于Oracle软件包的数据库.SQL Server具有CLR程序集,但它需要使用.NET CLR代码而不是本机TSQL/PLSQL.