2014-02-05 50 views
1
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) 
) 

火鸟2.5.2(4096页大小,字符集UTF8)产生异常:FBSQLException密钥大小超过实施

org.firebirdsql.jdbc.FBSQLException:GDS异常。 335544351. 不成功的元数据更新密钥的长度超过实施 限制索引“RDB $ PRIMARY43”

我也遇到关于列名大小相同的限制的例外(31个字符,我认为)

所有放入系统限制是一在专业的Hibernate项目中使用Firebird的障碍,是否有可能在没有所有限制的情况下重建Firebird项目的Linux和Windows?或者是否有另一种方法来打破限制。

+1

Firebird中的索引大小有限,确切的限制取决于1)Firebird版本和2)数据库的页面大小。请包括Firebird版本,页面大小和列定义(数据类型,长度,字符集(和数据库默认字符集))。顺便说一句:你的主键包含** 6 **列,似乎有点过分。 –

+0

这是有目的地完成的,我使用嵌入式密钥,因为我需要确保某些表的代码或标识必须可以在其他表中访问,这可以防止我进行大量连接以获得想要的结果,以简化并优化 –

回答

1

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_codeIdNOT上市,假设它是empPrd_prd_exe_fdr_codeId NUMERIC(18,0) = 8字节
  • empPrd_prd_period INTEGER = 4字节

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

至于列名,Firebird中对象名的当前限制是31个字符(类似于Oracle的30个字节的限制)。此功能请求(CORE-749)尚未计划完成,我预计在可预见的将来。与其他具有此限制的数据库一样,您需要使用例如@Column(name="theshortername")来提供明确的列名称。其他对象也有类似的选项。

+0

谢谢,非常非常mutch,empPrd_emp_code VARCHAR(255)应该是VARCHAR(20)而不是255,我认为这应该可以解决问题 –

+0

@ user3252285我期望如此,因为这会导致索引键为224字节(+开销)。 –

+0

实际上,目标ID被配置为20个字符长度,但JPA生成器无法从组合键中检索正确的长度,所以我使用@JoinColumns注解强制它,没有您的帮助,我认为问题是关于列索引的数量,而不是总数的大小,所以再次感谢 –