我试图创建一个列与varchar(4000)和创建一个主键上,是抛出错误。而当我尝试用varchar(1599)创建一个列并在上面添加一个主键时,它工作得很好。那么,这是否意味着oracle中主列的最大大小是varchar(1599)?Oracle版本=> 19.16.0.0.0我试着像:
CREATE TABLE table( PK1_name varchar(4000 char) PRIMARY KEY NOT NULL);
qxgroojn1#
ORA-01450:超过最大密钥长度(字符串)原因:CREATE INDEX语句中指定的所有列的合并长度超过了最大索引长度。最大索引长度因操作系统而异。
总索引长度计算为所有索引列的宽度加上索引列的数目之和。日期字段的长度为7,字符字段的长度为定义的长度,数值字段的长度为22。数值长度=(精度/2)+ 1。如果为负,则加+1。
**操作:**选择要索引的列,使索引总长度不超过操作系统的最大索引长度。
另请参阅特定于操作系统的Oracle文档。在my数据库中,它工作:
SQL> CREATE TABLE test ( PK1_name varchar(4000 char) PRIMARY KEY NOT NULL); Table created. SQL>
不过,请注意,您发布的代码是无效的(表名不能是table)。另外,主键不允许空值,因此将该列指定为not null没有任何用处。最后,Oracle建议我们使用varchar2数据类型而不是varchar。正如我所评论的,选择varchar2(4000)列作为主键很少是一个好主意; Oracle的优化器可能会选择使用全表扫描,而不是使用如此长的索引。我建议您放弃这种想法,为主键创建另一列;在19 c上,一个选项是使用identity列,因此
table
not null
varchar2
varchar
varchar2(4000)
SQL> create table test2 2 (id number generated always as identity primary key, 3 name varchar2(4000) 4 ); Table created. SQL>
[编辑]
截至您的评论:这就是我的数据库中发生的事情:
SQL> CREATE TABLE test1 2 ( 3 col1 VARCHAR (4000) NOT NULL, 4 col2 VARCHAR (4000) NOT NULL, 5 col3 VARCHAR (4000), 6 col4 VARCHAR (4000), 7 col5 VARCHAR (4000) NOT NULL, 8 col6 VARCHAR (4000), 9 col7 VARCHAR (4000), 10 PRIMARY KEY (col1, col2, col3) 11 ); CREATE TABLE test1 * ERROR at line 1: ORA-01450: maximum key length (6398) exceeded SQL>
但是,再一次:当我看到一堆VARCHAR 2(4000)列和其中一个或几个组成主键时,这闻起来像是糟糕的,糟糕的,糟糕的数据模型。重新考虑一下你在做什么。
1条答案
按热度按时间qxgroojn1#
ORA-01450:超过最大密钥长度(字符串)
原因:CREATE INDEX语句中指定的所有列的合并长度超过了最大索引长度。最大索引长度因操作系统而异。
总索引长度计算为所有索引列的宽度加上索引列的数目之和。
日期字段的长度为7,字符字段的长度为定义的长度,数值字段的长度为22。数值长度=(精度/2)+ 1。如果为负,则加+1。
**操作:**选择要索引的列,使索引总长度不超过操作系统的最大索引长度。
另请参阅特定于操作系统的Oracle文档。
在my数据库中,它工作:
不过,请注意,您发布的代码是无效的(表名不能是
table
)。另外,主键不允许空值,因此将该列指定为not null
没有任何用处。最后,Oracle建议我们使用varchar2
数据类型而不是varchar
。正如我所评论的,选择
varchar2(4000)
列作为主键很少是一个好主意; Oracle的优化器可能会选择使用全表扫描,而不是使用如此长的索引。我建议您放弃这种想法,为主键创建另一列;在19 c上,一个选项是使用identity列,因此[编辑]
截至您的评论:这就是我的数据库中发生的事情:
但是,再一次:当我看到一堆VARCHAR 2(4000)列和其中一个或几个组成主键时,这闻起来像是糟糕的,糟糕的,糟糕的数据模型。重新考虑一下你在做什么。