如何使用JPA以编程方式创建长度有限的MySQL索引?

时间:2017-02-21 10:45:36

标签: java mysql spring jpa

here类似,我用

注释我的班级
git push heroku master

尝试创建具有@Table(indexes = {@Index(columnList = "name")}) 列最大长度的非唯一索引。不幸的是,这是不可能的,因为它是varcharvarchar(255)列。 phpMyAdmin通过点击UI中的相应按钮添加了utf8mb4,所以至少我的软件现在可以运行高效的查询。

现在我想知道在创建数据库模式时是否可以让我的Java类自动生成有限长度的索引?该代码构建于KEY '...' (name(191))

2 个答案:

答案 0 :(得分:2)

除了试图让第三方软件做一些可能允许或不允许的事情之外,还有其他答案。

  • 对列大小有191个限制。或者,你真的有一个介于191和255之间的最大值。
  • 更改为utf8(来自utf8mb4)。并且失去了存储表情符号和一些汉字的能力。
  • 在5.6中有一个笨拙的过程来提高你所遇到的767限制。
  • 升级到5.7,这实际上消除了这个问题。

答案 1 :(得分:1)

您应该只使用JPA生成的表脚本作为起点,您绝不应该使用JPA在生产中创建表。

如果您具有“创建表”权限,那么您不需要DBA来创建和修改数据库,那么我建议您使用Flyway来管理数据库创建和迁移。 如果您需要与数据库无关,并且像长XML文件一样,您也可以使用LiquideBase

使用flyway,每次添加一个或多个实体时都会添加一个新脚本。我通常让JPA创建脚本,然后复制我需要的东西,也许做一些修改 - 例如#!/usr/bin/env python2 from functools import wraps class CommandInfo(object): cmds = [] def __init__(self, shortname, longname, func): self.shortname = shortname self.longname = longname self.func = func class CommandDispatch(object): def __init__(self, shortname, longname): self.shortname = shortname self.longname = longname def __call__(self, func): print("hello from CommandDispatch's __call__") @wraps(func) def wrapped_func(wself, *args, **kwargs): print('hello from wrapped_func, args:{0}, kwargs: {1}'.format(args, kwargs)) func(wself, *args, **kwargs) ci = CommandInfo ci.cmds += [ci(shortname=self.shortname, longname=self.longname, func=func)] return wrapped_func @staticmethod def func(name): print('hello from CommandDispatch.func') for ci in CommandInfo.cmds: if ci.shortname == name or ci.longname == name: return ci.func raise RuntimeError('unknown command') @CommandDispatch(shortname='co', longname='commit') def commit(msg): print('commit msg: {}'.format(msg)) commit('sample commit msg') # Normal call by function name cd = CommandDispatch short_f = cd.func(name='co') # Call by shortname short_f('short sample commit msg') long_f = cd.func(name='commit') # Call by longname long_f('long sample commit msg') class A(object): @CommandDispatch(shortname='Aa', longname='classAmethoda') def a(self, msg): print('A.a called, msg: {}'.format(msg)) a = A() short_fA = cd.func(name='Aa') short_fA(a, 'short A.a msg') long_fA = cd.func(name='classAmethoda') long_fA(a, 'short A.a msg') 在某些数据库上意味着255个字节,所以你可能想要修改它,如果你存储的不是拉丁语 - 1。

Flyway使用非常简单,并且完全集成到Spring启动中,因此您只需在第一个(或更晚的)飞路脚本varchar(255)中按照您希望的方式添加唯一索引。