在我的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中执行类似操作。
答案 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
并创建新索引。