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

Respostas:

420

Basta usar uma cláusula where que não seleciona nenhuma linha:

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

Limitações

O seguinte não será copiado para a nova tabela:

  • sequências
  • gatilhos
  • índices
  • algumas restrições podem não ser copiadas
  • logs de exibição materializada

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


Jim Hudson
fonte
53
Essa é uma ótima resposta limpa. Só quero lembrar que isso não incluirá restrições .. a nova tabela não terá uma chave primária.
31435 JosephStyons
18
isso não irá replicar seqüências ou gatilhos também.
branchgabriel
16
nem será a nova tabela tem nenhum índices - não seja pego tentando fazer uma grande consulta sobre a nova tabela :-)
hamishmcn
8
também não lida com partições. Mas ei.
MK.
17
Apenas um adendo - que irá conter algumas restrições - ou seja, qualquer NÃO restrições NULL serão copiados.
Jeffrey Kemp
84

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

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

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

Isso fornecerá o texto completo da instrução de criação que você pode modificar conforme desejar para criar a nova tabela. Você precisaria alterar 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 agora é muito mais fácil.)

Editado para adicionar Se a tabela que você procura estiver em um esquema diferente:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
Dave Costa
fonte
Como esse comando será modificado se eu quiser copiar de outro esquema.
kushalvm
My_table_nameé a tabela existente. Mas como faço para criar o nome da minha nova tabela?
Kushalvm
O comando na minha resposta não cria a nova tabela; retorna o SQL que você usaria para recriar a tabela original. Você modifica como desejado e depois executa. Portanto, o nome da nova tabela é o que você escolher especificar.
Dave Costa
5
Portanto, deve ser como atribuir o comando sql acima a uma variável. ryt? por exemplo . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Enquanto isso, por favor, deixe-me saber o que LONG faz aqui.
Kushalvm
15

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 ao executá-la em uma planilha sql

O sqldeveloper é um aplicativo gratuito da oracle.

Se a tabela tiver seqüências ou gatilhos, o ddl às vezes também os gerará. Você só precisa ter cuidado com a ordem em que os faz entrar e saber quando ativar ou desativar os gatilhos.

branchgabriel
fonte
No Oracle SQL Developer v.18.3 a guia é chamadoSQL
Metafaniel
14
create table xyz_new as select * from xyz where rownum = -1;

Para evitar iterar repetidamente e não inserir nada com base na condição em que 1 = 2

sunleo
fonte
4
    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; 
Brian Leach
fonte
3

Você pode fazer isso, Create table New_table as select * from Old_table where 1=2 ; mas tenha cuidado. A tabela que você cria da dose não possui nenhum Índice, Pk e assim por diante, como a tabela_ antiga

Mohsen Molaei
fonte
2
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 não retorne dados:

adivinha quem
fonte
1

você também pode fazer um

create table abc_new as select * from abc; 

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

Digo
fonte
11
Obviamente, se você tiver muitos dados na tabela original, isso pode ser uma péssima idéia. ;)
Alexios 10/10
1

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.

user3284249
fonte
1

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

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

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

DKroot
fonte
1

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

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEé TABLE, PROCEDUREetc.

Com este comando, você pode obter a maioria do ddl a partir de objetos de banco de dados.

Diogo Maschio
fonte
Observe que os argumentos GET_DDLdiferenciam maiúsculas de minúsculas.
Sridhar Sarnobat 17/07/19
0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table é a tabela da qual você deseja copiar a estrutura.

Prashant Mishra
fonte
0

Usando o desenvolvedor do pl / sql, você pode clicar com o botão direito do mouse no nome da tabela na área de trabalho do sql ou no explorador de objetos, clicar em "visualizar" e clicar em "visualizar 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

Yariv Scheingut
fonte
0

copiar sem dados da tabela

create table <target_table> as select * from <source_table> where 1=2;

copiar com dados da tabela

create table <target_table> as select * from <source_table>;
Alok
fonte
0
  1. crie a tabela xyz_new como selecione * de xyz;

- Isso criará tabela e copiará todos os dados.

  1. excluir de xyz_new;

- Isso terá a mesma estrutura de tabela, mas todos os dados copiados serão excluídos.

Se você deseja superar as limitações especificadas pela resposta: Como posso criar uma cópia de uma tabela Oracle sem copiar os dados?

Jeevan Reddy Gujjula
fonte
-5

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

PASSO 1:

CREATE table new_table_name AS(Select * from old_table_name);

O exemplo queryacima cria uma duplicata de uma tabela (também com conteúdo).

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. Deu-me muitas idéias.

Donkha
fonte
13
Isso é ainda menos eficiente que a truncateversão. Além de alocar extensões para todos os dados, você não os liberará ao excluir, portanto, você está potencialmente desperdiçando espaço, a menos que a tabela cresça para o tamanho antigo. E você está gerando desfazer / refazer na inserção e na exclusão. A resposta de Jim simplesmente evita tudo isso.
Alex Poole