Pergunta

Eu sei que a declaração:

create table xyz_new as select * from xyz;

O que copia a estrutura e os dados, mas o que se eu só quero a estrutura?

Foi útil?

Solução

Basta usar uma cláusula WHERE que não irá selecionar todas as linhas:

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

Limitações

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

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

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


Outras dicas

Eu usei o método que você aceitou muito, mas como alguém salientou que não duplica 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;

Isto lhe dará a plena criar texto de instrução que você pode modificar como você deseja 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 que utilizam EXP / IMP, mas é muito mais fácil agora.)

editado para adicionar Se a tabela que você está depois está em um esquema diferente:

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

Usando desenvolvedor SQL SELECT na tabela e clique na guia DDL

Você pode usar esse código para criar uma nova tabela sem dados quando você executá-lo em um sql planilha

sqldeveloper é livre de usar aplicativo da Oracle.

Se a tabela tem sequências ou gatilhos o ddl, às vezes, gerar aqueles para você também. Você apenas tem que ter cuidado com o fim de fazê-los em e saber quando virar os gatilhos ligado ou desligado.

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

Para evitar iteração novamente e inserção 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 criada a dose não tem qualquer Index, Pk e assim por diante como o tabela_antiga

SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Criar uma nova tabela, vazio usando o esquema de outro. Basta adicionar uma cláusula WHERE que faz com que a consulta para retornar sem dados:

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 que você deseja copiar, isso irá copiar apenas a estrutura.

WHERE 1 = 0 ou falsos condições semelhantes de trabalho, mas eu não gosto como eles olham. Marginalmente código mais limpo para Oracle 12c + IMHO é

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

As mesmas limitações se aplicam: definições única coluna e sua nulidade são copiados para a nova tabela

.

Você também pode fazer um

create table abc_new as select * from abc; 

, em seguida, truncar o abc_new mesa. Espero que isso será suficiente a sua exigência.

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

source_table é a tabela U quer copiar a estrutura.

Usando PL / SQL Developer você pode clique direito sobre o table_name, quer no espaço de trabalho SQL ou no objeto Explorer, que clique em "Ver" e que clique em "Ver sql", que gera o script sql para criar a tabela, juntamente com todas as restrições, índices, divisórias etc ..

Em seguida, você executar o script usando o new_table_name

Em outra forma você pode obter ddl de criação da tabela de comando listados 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 maioria dos ddl a partir de objetos de banco de dados.

copiar sem os dados da tabela

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

copiar com os dados da tabela

create table <target_table> as select * from <source_table>;

A tarefa acima pode ser concluído em dois passos simples.

PASSO 1:

CREATE table new_table_name AS(Select * from old_table_name);

O query acima cria uma segunda via de uma tabela (com conteúdo tão bem).

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

ETAPA 2:

DELETE * FROM new_table_name.

Espero que isso resolve o seu problema. E graças aos posts anteriores. Deu-me um monte de insight.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top