【问题标题】:Unique constraints on TEXT columns in JPA using MySQL InnoDB使用 MySQL InnoDB 对 JPA 中 TEXT 列的唯一约束
【发布时间】:2011-09-15 14:55:17
【问题描述】:

我们需要将一个长的 UTF-8 字符串存储到 MySQL 数据库中,该数据库必须检查其唯一性。这是当前配置:

@Column(unique = true,length = 8000,columnDefinition="TEXT")
private String text;

但由于 MySQL 需要为 BLOBTEXT 字段指定索引前缀,因此失败并出现以下错误:

BLOB/TEXT column 'path' used in key specification without a key length

如何正确配置我的 ORM 映射以支持此类用例?

【问题讨论】:

  • MySQL 不能索引超过一定长度 IIRC 的 TEXT 字段,并且只允许最多 1000 个(最左边)作为索引的一部分,并且不知道任何允许指定该字段的 ORM从整列的长度上分离

标签: mysql sql jpa innodb unique


【解决方案1】:

你考虑过calculating a hash value for your text string吗?然后你可以存储散列值并检查散列值的唯一性。您与哈希值发生任何冲突,然后检查实际的文本字符串。如果它们不同,那么您将包含一个序列值。如果没有,你已经发现了你的错误。所以你的桌子是

Hash、Sequence(同一个Hash值内唯一)、TextString

你的唯一索引是

哈希、序列

为了测试唯一性,计算哈希值并尝试用零序列存储它。如果您不能将其存储在序列零处,则比较序列零处的文本字符串。如果它们相同,您会发现重复的文本。如果它们不同,则尝试在序列 1 处存储。重复此操作,直到在该序列号处找到重复的文本字符串,或者将其与下一个可用序列号一起存储在数据库中时不会失败。

诀窍在于找出一个不会给您太多重复项并且可以处理长文本字符串的哈希算法。更好的是可以为您执行此操作的出色 ORM。

【讨论】:

  • 最终,我们走这条路,同时试图找到对我的问题更直接的答案。正如我们所了解的,没有什么 ORM 仙粉可以帮助我们,它也成为了我们问题的最终解决方案。谢谢你把它写下来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2010-11-16
  • 2011-03-25
相关资源
最近更新 更多