Respuestas:
Solo use una cláusula where que no seleccione ninguna fila:
create table xyz_new as select * from xyz where 1=0;
Las siguientes cosas no se copiarán en la nueva tabla:
Esto tampoco maneja particiones
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;
My_table_name
es la tabla existente Pero, ¿cómo obtengo el nombre de mi nueva tabla creada?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
Mientras tanto, avíseme qué hace LONG aquí.
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.
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;
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
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:
Simplemente escriba una consulta como:
create table new_table as select * from old_table where 1=2;
donde new_table
está el nombre de la nueva tabla que desea crear y old_table
es el nombre de la tabla existente cuya estructura desea copiar, esto solo copiará la estructura.
WHERE 1 = 0
o 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.
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
TYPE
es TABLE
, PROCEDURE
etc.Con este comando puede obtener la mayoría de ddl de los objetos de la base de datos.
GET_DDL
distinguen entre mayúsculas y minúsculas.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table es la tabla de la que quieres copiar la estructura.
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
- crear tabla xyz_new como select * from xyz;
- Esto creará una tabla y copiará todos los datos.
- eliminar de xyz_new;
- Esto tendrá la misma estructura de tabla pero todos los datos copiados serán eliminados.
Si desea superar las limitaciones especificadas por la respuesta: ¿Cómo puedo crear una copia de una tabla de Oracle sin copiar los datos?
La tarea anterior se puede completar en dos simples pasos.
CREATE table new_table_name AS(Select * from old_table_name);
Lo query
anterior crea un duplicado de una tabla (con contenido también).
Para obtener la estructura, elimine el contenido de la tabla usando.
DELETE * FROM new_table_name.
Espero que esto resuelva tu problema. Y gracias a las publicaciones anteriores. Me dio mucha información.
truncate
versió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.