Oracle:是否可以在不指定列的情况下使用CTA创建物联网副本?

Oracle:是否可以在不指定列的情况下使用CTA创建物联网副本?,oracle,oracle12c,Oracle,Oracle12c,我使用CTAS(Create Table As Select)语法创建表的副本,方法如下: CREATE TABLE TABLE2 AS SELECT * FROM TABLE1; 因此,表2是表1的完整副本,包括所有列 我想对物联网表做同样的事情 但如果我尝试执行以下操作: CREATE TABLE IOT_TABLE2 ORGANIZATION INDEX AS SELECT * FROM IOT_TABLE1; 我获得: ORA-25175: no PRIMARY KEY constr

我使用CTAS(Create Table As Select)语法创建表的副本,方法如下:

CREATE TABLE TABLE2 AS SELECT * FROM TABLE1;
因此,表2是表1的完整副本,包括所有列

我想对物联网表做同样的事情

但如果我尝试执行以下操作:

CREATE TABLE IOT_TABLE2 ORGANIZATION INDEX AS SELECT * FROM IOT_TABLE1;
我获得:

ORA-25175: no PRIMARY KEY constraint found
有一些技巧可以做到这一点,或者不指定所有列就不可能创建副本?

尝试如下

CREATE TABLE IOT_TABLE2(id, col1, col2 .... , CONSTRAINT pk PRIMARY KEY (id)) 
ORGANIZATION INDEX AS SELECT * FROM IOT_TABLE1;

dbfiddle

多亏了@a_horse_和_no_name提示,我找到了一个合适的解决方案

鉴于此示例,IOT DDL:

CREATE TABLE "IOT_TABLE1" 
   (    "COLUMN1" VARCHAR2(50) NOT NULL ENABLE, 
    "COLUMN2" VARCHAR2(50) NOT NULL ENABLE, 
    "COLUMN3" NUMBER(18,0) NOT NULL ENABLE, 
    "COLUMN4" BINARY_DOUBLE, 
     CONSTRAINT "TABLE1_IOT_PK" PRIMARY KEY ("COLUMN1", "COLUMN2", "COLUMN3") ENABLE
   ) ORGANIZATION INDEX NOCOMPRESS;
这是一条SQL语句,可以创建物联网的完美副本:

DECLARE 
    stmt VARCHAR2(4000);
BEGIN 
    DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', false);
    DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', true);
    DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES', false);
    DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', false);
    SELECT TO_CHAR(DBMS_METADATA.get_ddl('TABLE','IOT_TABLE1')) INTO stmt FROM DUAL;
    stmt := REPLACE(stmt, 'TABLE1_IOT_PK', 'TABLE2_IOT_PK');
    stmt := REPLACE(stmt, 'TABLE1', 'TABLE2');
    stmt := regexp_replace(stmt, '^\s+(\()*\s*"(\w+).+$',chr(9)||'\1"\2",',1,0,'m');
    stmt := stmt || 'AS SELECT * FROM TABLE1';
    dbms_output.put_line(stmt);
    EXECUTE IMMEDIATE STMT;
END;
共有3个替换项:

  • PK名称
  • 表名
  • 必须消除类型信息,否则使用ORA-01773失败

  • dbfiddle

    问题是,CTAS创建的是表的副本,而不是它的约束(不是索引、触发器等)。IOT必须具有主键,并且不能从所创建表的投影中推断。因此ORA-25175。您真的要创建表的副本还是尝试重新组织表?@WernfriedDomscheit我的环境需要创建表的副本,而不是重新组织现有表。如果您不知道目的,请避免批评工作解决方案。Thanks@AlessandroC,我没有批评任何事情,也没有否决任何事情,我只是问了一个问题,因为你的要求看起来很特别。抱歉@Wernfrieddomsheit