Oracle中复合列的最大列varchar大小是多少

31moq8wy  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(139)

我正在尝试下面的东西,并得到例外。

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)”* 原因:

  • 行动:
nhjlsmyf

nhjlsmyf1#

这个blog post就是为了澄清这个特定的问题而编写的。这是它的要点:
Oracle数据库中最小的数据存储单位是块。默认值为8k(8,192字节)。
每个索引条目必须适合一个块。因此,索引值的最大大小必须小于块大小。减去一些存储开销。在默认安装中,这意味着最大的可索引值约为6,400字节。
由于您的primary key正在强制执行UNIQUE键(通过创建UNIQUE索引),因此它还需要适合单个块。
不能更改已创建数据库的块大小,请参阅:https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams049.htmhttps://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:226813934564
所以,如果你真的,真的想(我不建议这样做)增加你的块大小,那么你可以导出你的数据库,创建一个新的数据库与所需的块大小和导入导出的数据库。
但是,我强烈建议重新考虑这一点。使用三个文本字段作为primary key会给性能带来灾难,因为每次搜索primary key字段值时,都会与很长的文本进行比较。因此,如果您更改块大小,或者如果可能的话,实现一个cron作业,它会定期检查新记录是否满足您期望的唯一性,以减轻RDBMS的负担,那么创建一个数值字段作为primary key,或者在三个字段上创建一个unique索引会更有意义。

相关问题