我正在尝试下面的东西,并得到例外。
CREATE TABLE test1( col1 varchar(4000) NOT NULL, col2 varchar(4000) NOT NULL, col3 varchar(4000), col4 varchar(4000), col5 varchar(4000) NOT NULL, col6 varchar(4000), col7 varchar(4000) , PRIMARY KEY(col1, col2, col3))
Oracle版本=> 19.16.0.0.0
异常:错误报告- ORA-01450:最大密钥长度(6398)超过01450。00000 -“超过最大密钥长度(%s)”* 原因:
- 行动:
1条答案
按热度按时间nhjlsmyf1#
这个blog post就是为了澄清这个特定的问题而编写的。这是它的要点:
Oracle数据库中最小的数据存储单位是块。默认值为8k(8,192字节)。
每个索引条目必须适合一个块。因此,索引值的最大大小必须小于块大小。减去一些存储开销。在默认安装中,这意味着最大的可索引值约为6,400字节。
由于您的
primary key
正在强制执行UNIQUE
键(通过创建UNIQUE
索引),因此它还需要适合单个块。不能更改已创建数据库的块大小,请参阅:https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams049.htm和https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:226813934564
所以,如果你真的,真的想(我不建议这样做)增加你的块大小,那么你可以导出你的数据库,创建一个新的数据库与所需的块大小和导入导出的数据库。
但是,我强烈建议重新考虑这一点。使用三个文本字段作为
primary key
会给性能带来灾难,因为每次搜索primary key
字段值时,都会与很长的文本进行比较。因此,如果您更改块大小,或者如果可能的话,实现一个cron作业,它会定期检查新记录是否满足您期望的唯一性,以减轻RDBMS的负担,那么创建一个数值字段作为primary key
,或者在三个字段上创建一个unique
索引会更有意义。