Grails:更改hibernate方言时SQL语法错误

时间:2012-08-22 16:06:26

标签: mysql grails

我正在使用Grails和mySQL数据库,我正在尝试更改数据库引擎。据我所研究,这可以用

做得最好
 dialect = "org.hibernate.dialect.[MyDialect]" 
DataSource.groovy配置中的

。但是当我将方言设置为org.hibernate.dialect.MySQLMyISAMDialect时,我的表的创建失败并显示错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'类型= MyISAM'在第1行

我还试图稍后改变表:

sql.execute("ALTER TABLE book ENGINE = MYISAM;")

这实际上有效,但在创建后更改引擎时,所有外键都会被删除。

我应该如何避免错误并正常更换发动机?

1 个答案:

答案 0 :(得分:1)

为什么要使用MyISAM ???它不支持外键或事务。而且它很少比InnoDB快,因为InnoDB使用行锁和MVCC,而不是MyISAM的全表锁。

话虽如此,你可以让它发挥作用。您必须使用较新版本的MySQL,因为type属性已弃用一段时间而现在不受支持 - 您必须使用ENGINE。没有方言可以支持这一点(注意org.hibernate.dialect.MySQL5InnoDBDialect对InnoDB做正确的事情)所以你需要创建自己的方言。

在src / groovy或src / java中创建此类(更改包和/或类名):

package com.mycompany.myapp

import org.hibernate.dialect.MySQLMyISAMDialect

class MySQL5MyISAMDialect extends MySQLMyISAMDialect {
   String getTableTypeString() {
      " ENGINE=MyISAM"
   }
}

并在您的问题中显示的DataSource.groovy中引用它:

dialect = com.mycompany.myapp.MySQL5MyISAMDialect