Como posso criar uma cópia de uma tabela Oracle sem copiar os dados?
-
04-07-2019 - |
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?
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.