Respostas:
Basta usar uma cláusula where que não seleciona nenhuma linha:
create table xyz_new as select * from xyz where 1=0;
O seguinte não será copiado 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 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;
My_table_name
é a tabela existente. Mas como faço para criar o nome da minha nova tabela?
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.
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.
SQL
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 da dose não possui nenhum Índice, Pk e assim por diante, como a tabela_ antiga
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:
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.
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. 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.
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
, PROCEDURE
etc.Com este comando, você pode obter a maioria do ddl a partir de objetos de banco de dados.
GET_DDL
diferenciam maiúsculas de minúsculas.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table é a tabela da qual você deseja copiar a estrutura.
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
- crie a tabela xyz_new como selecione * de xyz;
- Isso criará tabela e copiará todos os dados.
- 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?
A tarefa acima pode ser concluída em duas etapas simples.
CREATE table new_table_name AS(Select * from old_table_name);
O exemplo query
acima cria uma duplicata de uma tabela (também com conteúdo).
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. Deu-me muitas idéias.
truncate
versã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.