【问题标题】:Grails: error in SQL syntax when changing the hibernate dialectGrails:更改休眠方言时 SQL 语法错误
【发布时间】:2012-08-18 02:44:23
【问题描述】:

我正在将 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;")

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

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

【问题讨论】:

标签: mysql grails


【解决方案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

【讨论】:

  • 非常感谢!它正在覆盖该方法。我想使用 MyISAM 的全文搜索功能,我现在不需要翻译和外键支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2015-07-26
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多