2

我正在将 Grails 与 mySQL 数据库一起使用,并且正在尝试更改数据库引擎。据我研究,这可以做到最好

 dialect = "org.hibernate.dialect.[MyDialect]" 

在 DataSource.groovy 配置中。但是当我将方言设置为 org.hibernate.dialect.MySQLMyISAMDialect 时,我的表的创建失败并出现错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'type=MyISAM' 附近使用正确的语法

稍后我还尝试使用以下方法更改表格:

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

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

我应该如何避免错误并正常更换引擎?

4

1 回答 1

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
于 2012-08-22T17:04:51.270 回答