Oracle使用CREATE AS创建索引组织表报ORA-00933错误如何解决
问题解决方法
错误原因
Oracle的CREATE TABLE AS SELECT(CTAS)语法中,ORGANIZATION INDEX属于表的物理属性配置项,必须放置在AS SELECT子句之前,你将该参数写在SELECT语句末尾,不符合Oracle语法规范,因此触发ORA-00933报错。
另外索引组织表(IOT)有强制要求:必须显式定义主键约束,缺少主键的情况下也无法成功创建IOT。
正确实现步骤
语法规范
创建带数据的IOT的正确语法结构为:先声明表的约束、物理属性,再写AS SELECT查询导入数据。
示例代码
假设原表clients的主键字段为client_id,可执行以下语句完成复制:
CREATE TABLE clients2 ( CONSTRAINT pk_clients2 PRIMARY KEY (client_id) ) ORGANIZATION INDEX AS SELECT * FROM clients;
如果需要更稳妥的字段类型匹配,也可以显式声明所有字段:
CREATE TABLE clients2 ( client_id NUMBER PRIMARY KEY, client_name VARCHAR2(100), -- 其余字段定义和原表clients保持完全一致 ) ORGANIZATION INDEX AS SELECT * FROM clients;
注意事项
- 必须提前确认要作为主键的字段没有空值、没有重复值,否则主键约束创建失败会导致整句执行报错
- 如果原表
clients没有设置主键,需要先给原表新增主键,或者在创建clients2时手动指定合适的非空唯一字段作为主键
内容的提问来源于stack exchange,提问作者Sami AOUAD
相关产品推荐
相关产品推荐

