Oracle中主列的最大列varchar大小是多少

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

我试图创建一个列与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);
qxgroojn

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列,因此

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)列和其中一个或几个组成主键时,这闻起来像是糟糕的,糟糕的,糟糕的数据模型。重新考虑一下你在做什么。

相关问题