sql - FBSQLException 键大小超出实现

标签 sql hibernate firebird

create table RHP_EmployeElement (
    amount double precision not null, 
    comment varchar(255), 
    loan blob, 
    element_codeId varchar(30), 
    empPrd_emp_code varchar(255), 
    empPrd_emp_folder_codeId numeric(18,0),
    empPrd_prd_exe_exercice integer, 
    empPrd_prd_exe_fdr_codeId numeric(18,0), 
    empPrd_prd_period integer, 
    primary key (element_codeId,
        empPrd_emp_code, empPrd_emp_folder_codeId, empPrd_prd_exe_exercice,
        empPrd_prd_exe_folder_codeId, empPrd_prd_period)
)

Firebird 2.5.2(页面大小为 4096,UTF8 字符集)生成异常:

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544351. unsuccessful metadata update key size exceeds implementation restriction for index "RDB$PRIMARY43"

我也遇到了关于列名称大小的相同限制异常(我认为是 31 个字符)

所有这些限制都是在专业 Hibernate 项目中使用 Firebird 的障碍,是否可以在没有所有这些限制的情况下为 Linux 和 Windows 重建 Firebird 项目?或者是否有其他方法来打破这些限制。

最佳答案

Indexes in Firebird 2.0以及更高的值受页面大小的限制:索引键不能超过页面大小的 1/4。对于页面大小 4096,这意味着索引键长度最大为 1024 字节,对于页面大小 16384,索引键长度为 4096 字节。

您的主键(及其支持索引)由以下列组成:

  • element_codeId VARCHAR(30) = 30 字节(单字节字符集)或 120 (UTF8)
  • empPrd_emp_code VARCHAR(255) = 255 字节(单字节字符集)或 1020 (UTF8)
  • empPrd_emp_folder_codeId NUMERIC(18,0) = 8 字节
  • empPrd_prd_exe_exercice INTEGER = 4 字节
  • empPrd_prd_exe_folder_codeId 未列出,假设为 empPrd_prd_exe_fdr_codeId NUMERIC(18,0) = 8 字节
  • empPrd_prd_period INTEGER = 4 字节

这导致总索引键为 309(单字节字符集)或 1164(+ 多列、排序规则等的一些额外字节开销)。对于字符集 UTF8 和页面大小 4096,这超出了页面大小规则的 1/4。解决方案是为数据库使用更大的页面大小,或者为 VARCHAR 列使用单字节字符集。

对于列名,Firebird 3.0 及更早版本中对象名的当前限制是 31 个字符(类似于 Oracle 的 30 个字节的限制)。 Firebird 4 已实现扩展此功能的功能请求 ( CORE-749 )。与具有此限制的其他数据库系统一样,您需要使用 @Column(name="theshortername"等提供显式列名称)。其他对象也存在类似的选项。

关于sql - FBSQLException 键大小超出实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577674/

相关文章:

php - 查询返回数据以及来自另一个表的数据

c# - 从未见过的MySQL连接错误

MYSQL - 基于其他列中公共(public)值的列的 SUM

java - 基于Spring的应用程序无法初始化entityManagerFactory,NoSuchMethodError

c# - 如何使用 .NET 数据提供程序在 firebird 数据库中使用大文件 (1Gb) 更新二进制 blob 字段?

mysql - 合并同一个表中的多行(一周中的几天)

java - Hibernate 更改 @Formula 中的别名

java - Hibernate - 具有排序顺序的多列索引

mysql - 面试中的 SQL 任务

java - 嵌入式 Firebird 和 Log4j 配置