今天 一个同事在创建联合唯一索引的时候报了以下这个错
The primary key, unique key, or table partitioning key identified by "ATTRIBUTE_ROWID_UN" is too long or has too many columns.. SQLCODE=-613, SQLSTATE=54008, DRIVER=4.14.113
在印象中好像数据库对联合索引的列是没有限制的 因为联合索引的列一定不会超过所在表的列 所以表空间应该有足够的长度容下它,其实这是不对的。
首先普及几个基本知识 1.如果正在创建的表 他的column长度超过了默认表空间 DB2会自动为他指定更大的表空间(如果有个话)。
2.在表上创建的索引如果不指定表空间的话 会默认跟表在一个表空间里。
3.主键和唯一约束不能定义在long varchar的column上。
就DB2而言 有一个Max Key Length的概念 ,它的长度是根据索引所在表空间的page size决定的。
下面有一个官方给的列表
Max Key Length Page size
-------------- ---------
1K 4K
2K 8K
4K 16K
8K 32K
所以 这次错误的原因是表所在的表空间是4K的 但是联合唯一索引的长度超过了Max Key Length (1K).
解决方案:
创建联合唯一索引的时候把索引指定到更大的表空间。