Oracle:是否可以在不指定列的情况下使用CTA创建物联网副本?
我使用CTAS(Create Table As Select)语法创建表的副本,方法如下: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
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个替换项:
dbfiddle问题是,CTAS创建的是表的副本,而不是它的约束(不是索引、触发器等)。IOT必须具有主键,并且不能从所创建表的投影中推断。因此ORA-25175。您真的要创建表的副本还是尝试重新组织表?@WernfriedDomscheit我的环境需要创建表的副本,而不是重新组织现有表。如果您不知道目的,请避免批评工作解决方案。Thanks@AlessandroC,我没有批评任何事情,也没有否决任何事情,我只是问了一个问题,因为你的要求看起来很特别。抱歉@Wernfrieddomsheit