Como posso criar uma cópia de uma tabela do Oracle sem copiar os dados?

Eu conheço a afirmação:

create table xyz_new as select * from xyz; 

Que copia a estrutura e os dados, mas e se eu quiser apenas a estrutura?

Apenas use uma cláusula where que não selecione nenhuma linha:

 create table xyz_new as select * from xyz where 1=0; 

Limitações

As seguintes coisas não serão copiadas para a nova tabela:

  • seqüências
  • gatilhos
  • índices
  • algumas restrições podem não ser copiadas
  • registros de visão materializada

Isso também não lida com partições


Eu usei o método que você aceitou muito, mas como alguém apontou, ele não duplica as restrições (exceto para NOT NULL, eu acho).

Um método mais avançado, se você quiser duplicar a estrutura completa é:

 SET LONG 5000 SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL; 

Isso lhe dará o texto completo da instrução create que você pode modificar para criar a nova tabela. Você teria que mudar os nomes da tabela e todas as restrições, é claro.

(Você também pode fazer isso em versões mais antigas usando EXP / IMP, mas é muito mais fácil agora.)

Editado para adicionar Se a tabela que você está procurando está em um esquema diferente:

 SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL; 

Usando o sql developer, selecione a tabela e clique na guia DDL

Você pode usar esse código para criar uma nova tabela sem dados quando executá-la em uma planilha do SQL

sqldeveloper é livre para usar o aplicativo do oracle.

Se a tabela tiver seqüências ou gatilhos, o ddl às vezes também gerará esses para você. Você só precisa ser cuidadoso com a ordem em que você os invente e saber quando ativar ou desativar os gatilhos.

 create table xyz_new as select * from xyz where rownum = -1; 

Para evitar repetir uma e outra vez e inserir nada com base na condição em que 1 = 2

  DECLARE l_ddl VARCHAR2 (32767); BEGIN l_ddl := REPLACE ( REPLACE ( DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA')) , q'["OLDSCHEMA"]' , q'["NEWSCHEMA"]' ) , q'["OLDTABLSPACE"]' , q'["NEWTABLESPACE"]' ); EXECUTE IMMEDIATE l_ddl; END; 

Você pode fazer isso Create table New_table as select * from Old_table where 1=2 ; mas tenha cuidado A tabela que você cria não tem nenhum Index, Pk e assim por diante, como o old_table

 SELECT * INTO newtable FROM oldtable WHERE 1 = 0; 

Crie uma nova tabela vazia usando o esquema de outra. Basta adicionar uma cláusula WHERE que faz com que a consulta retorne nenhum dado:

Basta escrever uma consulta como:

 create table new_table as select * from old_table where 1=2; 

onde new_table é o nome da nova tabela que você deseja criar e old_table é o nome da tabela existente cuja estrutura você deseja copiar, isso copiará apenas a estrutura.

WHERE 1 = 0 ou condições falsas semelhantes funcionam, mas não gosto da aparência delas. O código marginalmente limpo para o Oracle 12c + IMHO é

CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;

As mesmas limitações se aplicam: somente as definições de coluna e sua capacidade de anulação são copiadas para uma nova tabela.

você também pode fazer um

 create table abc_new as select * from abc; 

então trunca a tabela abc_new . Espero que isso seja suficiente para sua exigência.

 Create table target_table As Select * from source_table where 1=2; 

Source_table é a tabela que você quer copiar a estrutura de.

Usando pl / sql developer você pode clicar com o botão direito no table_name no sql workspace ou no object explorer, então clique em “view” e então clique em “view sql” que gera o script sql para criar a tabela junto com todas as restrições , índices, partições etc.

Em seguida, você executa o script usando o new_table_name

De outra forma, você pode obter ddl da criação da tabela a partir do comando listado abaixo e executar a criação.

 SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL TYPE is ('TABLE','PROCEDURE', etc...) 

Com este comando você pode obter a maioria dos ddl dos objects de database.

copiar sem dados da tabela

 create table  as select * from  where 1=2; 

copiar com dados da tabela

 create table  as select * from ; 

A tarefa acima pode ser concluída em duas etapas simples.

PASSO 1:

 CREATE table new_table_name AS(Select * from old_table_name); 

A query acima cria uma duplicata de uma tabela (com o conteúdo também).

Para obter a estrutura, exclua o conteúdo da tabela usando.

PASSO 2:

 DELETE * FROM new_table_name. 

Espero que isso resolva seu problema. E graças aos posts anteriores. Me deu muito insight.