当我尝试将列从VARCHAR2(200)修改为VARCHAR2(1000)时,为什么会出现"ORA-01429:索引组织表"?

osc*_*tin 4 oracle alter-table varchar2

它目前是VARCHAR2(200)数据库中的一个,但它需要被提升到VARCHAR(1000),所以我试图运行这个脚本:

ALTER TABLE CONTRACTOR MODIFY
(
    NOTE VARCHAR2(1000)
);
Run Code Online (Sandbox Code Playgroud)

Oracle给了我这个:

ORA-01429:索引组织表:没有用于存储溢出行块的数据段

这是一个10g的数据库.有什么想法吗?我可以创建一个重复的列,复制数据,然后删除旧列,但我想知道在我这样做之前这个错误是什么.

Vin*_*rat 12

根据文档,您需要为可能很大的行指定溢出段以适合单个块.

考虑(10.2.0.3 - 8k块):

SQL> CREATE TABLE contractor (
  2     ID NUMBER PRIMARY KEY,
  3     data_1 CHAR(1000),
  4     data_2 CHAR(1000),
  5     data_3 CHAR(1000),
  6     data_4 CHAR(1000),
  7     data_5 CHAR(1000),
  8     NOTE VARCHAR2(200)
  9  ) 
 10  ORGANIZATION INDEX;

ORA-01429: Index-Organized Table: no data segment to store overflow row-pieces
Run Code Online (Sandbox Code Playgroud)

但是,当您指定溢出段时:

SQL> CREATE TABLE contractor (
  2     ID NUMBER PRIMARY KEY,
  3     data_1 CHAR(1000),
  4     data_2 CHAR(1000),
  5     data_3 CHAR(1000),
  6     data_4 CHAR(1000),
  7     data_5 CHAR(1000),
  8     NOTE VARCHAR2(200)
  9  )
 10  ORGANIZATION INDEX 
 11  OVERFLOW TABLESPACE USER_DATA;

Table created
Run Code Online (Sandbox Code Playgroud)

  • 而且您不能有任何索引条目跨度块-这就是为什么该限制仍然存在的原因。您无法在2K块大小的表空间中为VARCHAR2(4000)编制索引。 (2认同)