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;
As seguintes coisas não serão copiadas para a nova tabela:
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.
create table as select * from where 1=2;
create table as select * from ;
A tarefa acima pode ser concluída em duas etapas simples.
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.
DELETE * FROM new_table_name.
Espero que isso resolva seu problema. E graças aos posts anteriores. Me deu muito insight.