¿Cómo puedo crear una copia de una tabla de Oracle sin copiar los datos?

Respuestas:

420

Solo use una cláusula where que no seleccione ninguna fila:

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

Limitaciones

Las siguientes cosas no se copiarán en la nueva tabla:

  • secuencias
  • disparadores
  • índices
  • algunas restricciones pueden no ser copiadas
  • registros de vista materializados

Esto tampoco maneja particiones


Jim Hudson
fuente
53
Esta es una gran respuesta limpia. Solo quiero recordar que esto no incluirá ninguna restricción ... la nueva tabla ni siquiera tendrá una clave principal.
JosephStyons
18
esto tampoco replicará secuencias o disparadores.
branchgabriel
16
ni la nueva tabla tienen los índices - no quedar atrapados tratando de hacer una consulta grande en la nueva tabla :-)
hamishmcn
8
Tampoco maneja particiones. Pero hey.
MK.
17
Solo un apéndice , contendrá algunas restricciones, es decir, se copiará cualquier restricción NO NULA.
Jeffrey Kemp
84

Usé el método que aceptó mucho, pero como alguien señaló, no duplica las restricciones (excepto NOT NULL, creo).

Un método más avanzado si desea duplicar la estructura completa es:

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

Esto le dará el texto completo de la declaración de creación que puede modificar según lo desee para crear la nueva tabla. Tendría que cambiar los nombres de la tabla y todas las restricciones, por supuesto.

(También puede hacerlo en versiones anteriores con EXP / IMP, pero ahora es mucho más fácil).

Editado para agregar Si la tabla que busca está en un esquema diferente:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
Dave Costa
fuente
¿Cómo se modificará este comando si quiero copiarlo desde otro esquema?
kushalvm
My_table_namees la tabla existente Pero, ¿cómo obtengo el nombre de mi nueva tabla creada?
kushalvm
El comando en mi respuesta no crea la nueva tabla; devuelve el SQL que usaría para recrear la tabla original. Lo modifica como lo desee y luego lo ejecuta. Entonces, el nombre de la nueva tabla es lo que elija especificar.
Dave Costa
55
Por lo tanto, debe ser como asignar el comando sql anterior a una variable. ryt? p.ej . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Mientras tanto, avíseme qué hace LONG aquí.
kushalvm
15

Usando el desarrollador SQL, seleccione la tabla y haga clic en la pestaña DDL

Puede usar ese código para crear una nueva tabla sin datos cuando lo ejecuta en una hoja de trabajo sql

sqldeveloper es una aplicación gratuita de Oracle.

Si la tabla tiene secuencias o disparadores, el ddl a veces los generará también para usted. Solo debe tener cuidado en el orden en que los coloca y saber cuándo activar o desactivar los desencadenantes.

branchgabriel
fuente
En Oracle SQL Developer v.18.3 la pestaña se llamaSQL
Metafaniel
14
create table xyz_new as select * from xyz where rownum = -1;

Para evitar repetir una y otra vez e insertar nada en función de la condición donde 1 = 2

sunleo
fuente
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
fuente
3

Puede hacer esto, Create table New_table as select * from Old_table where 1=2 ; pero tenga cuidado. La tabla que crea no tiene ningún índice, paquete, etc., como la tabla_vieja

Mohsen Molaei
fuente
2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Cree una nueva tabla vacía usando el esquema de otra. Simplemente agregue una cláusula WHERE que hace que la consulta no devuelva datos:

adivina quién
fuente
1

también puedes hacer un

create table abc_new as select * from abc; 

luego truncar la tabla abc_new. Espero que esto sea suficiente para su requerimiento.

Digo
fuente
11
Por supuesto, si tiene MUCHOS datos en la tabla original, esta podría ser una muy, muy mala idea. ;)
Alexios
1

Simplemente escriba una consulta como:

create table new_table as select * from old_table where 1=2;

donde new_tableestá el nombre de la nueva tabla que desea crear y old_tablees el nombre de la tabla existente cuya estructura desea copiar, esto solo copiará la estructura.

usuario3284249
fuente
1

WHERE 1 = 0o condiciones falsas similares funcionan, pero no me gusta cómo se ven. El código marginalmente más limpio para Oracle 12c + IMHO es

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

Se aplican las mismas limitaciones: solo las definiciones de columna y su nulabilidad se copian en una nueva tabla.

DKroot
fuente
1

De otra manera, puede obtener ddl de la creación de la tabla desde el comando que se detalla a continuación y ejecutar la creación.

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

Con este comando puede obtener la mayoría de ddl de los objetos de la base de datos.

Diogo Maschio
fuente
Tenga en cuenta que los argumentos para GET_DDLdistinguen entre mayúsculas y minúsculas.
Sridhar Sarnobat
0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table es la tabla de la que quieres copiar la estructura.

Prashant Mishra
fuente
0

Con pl / sql developer puede hacer clic con el botón derecho en table_name en el espacio de trabajo sql o en el explorador de objetos, luego hacer clic en "ver" y luego hacer clic en "ver sql" que genera el script sql para crear la tabla junto con todas las restricciones , índices, particiones, etc.

Luego ejecuta el script usando new_table_name

Yariv Scheingut
fuente
0

copiar sin datos de la tabla

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

copiar con datos de la tabla

create table <target_table> as select * from <source_table>;
Alok
fuente
-5

La tarea anterior se puede completar en dos simples pasos.

PASO 1:

CREATE table new_table_name AS(Select * from old_table_name);

Lo queryanterior crea un duplicado de una tabla (con contenido también).

Para obtener la estructura, elimine el contenido de la tabla usando.

PASO 2:

DELETE * FROM new_table_name.

Espero que esto resuelva tu problema. Y gracias a las publicaciones anteriores. Me dio mucha información.

Donkha
fuente
13
Esto incluso menos eficiente que la truncateversión. Además de asignar extensiones para todos los datos, no los está liberando al eliminarlos, por lo que potencialmente está desperdiciando espacio a menos que la tabla crezca al tamaño anterior. Y está generando deshacer / rehacer tanto en la inserción como en la eliminación. La respuesta de Jim simplemente evita todo eso.
Alex Poole