使用InnoDB作为数据源在Grails域中指定索引前缀长度

时间:2016-03-09 12:08:48

标签: hibernate grails gorm

在我的Grails域中,我目前有

String value
static constraints = {
    value(blank: false, size: 1..400)
}
static mapping = {
    value index: 'value_Idx'
}

我的数据源是MySQL InnoDB,其最大索引长度为767 bytes

使用UTF-8这意味着最多255个字符,这反过来意味着必须使用前缀索引。

在MySQL< = 5.5中,我没有收到Grails的错误,当查看结果索引时,前缀默认调整为255:

mysql> show index from table;
+--------+-------------+--------+----------+--------+
|  ....  | Column_name |  ....  | Sub_part |  ....  |
+--------+-------------+--------+----------+--------+
|  ....  | value       |  ....  | 255      |  ..... |
+--------+-------------+--------+----------+--------+

在MySQL 5.6中,我在Grails应用程序启动期间收到错误:

ERROR hbm2ddl.SchemaUpdate - Unsuccessful: create index value_Idx on table (value)
ERROR hbm2ddl.SchemaUpdate - Index column size too large. The maximum column size is 767 bytes. 

documentation中说明了这一点:

  

如果指定的索引前缀长度大于允许的长度   最大值,长度默默地减少到最大长度。   在MySQL 5.6及更高版本中,指定索引前缀长度大于   最大长度会产生错误。

支持所有版本的MySQL i,在我的域类映射中明确指定前缀索引长度。这可能吗?这是如何实现的?

我知道如何在MySQL控制台中执行此操作但不知道如何在Grails / Gorm / Hibernate中执行类似操作。

1 个答案:

答案 0 :(得分:0)

最近踩到了同样的问题。

我们使用Grails Database Migration Plugin对其进行归档。按照文档中提供的安装步骤操作,然后创建一个新的更改日志grails-app/migrations/add-prefixed-index.groovy,例如:

databaseChangeLog = {
    changeSet(author: "authot", id: "addPrefixedIndex") {
        grailsChange {
            change {
                sql.execute('ALTER TABLE `table` ADD INDEX `value_Idx`(`value`(255));')
            }

            rollback {
                sql.execute('ALTER TABLE `table` DROP INDEX `value_Idx`;')
            }
        }
    }
}

不要忘记将新文件包含在主数据库更新日志中:include file: 'add-prefixed-index.groovy'

然后运行grails dbm-update并创建新索引。