Risposte:
Basta usare una clausola where che non selezionerà alcuna riga:
create table xyz_new as select * from xyz where 1=0;
Le seguenti cose non verranno copiate nella nuova tabella:
Anche questo non gestisce le partizioni
Ho usato il metodo che hai accettato molto, ma come qualcuno ha sottolineato, non duplica i vincoli (tranne per NOT NULL, credo).
Un metodo più avanzato se si desidera duplicare l'intera struttura è:
SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;
Questo ti darà il testo completo dell'istruzione create che puoi modificare come desideri per creare la nuova tabella. Dovresti cambiare i nomi della tabella e tutti i vincoli ovviamente.
(Puoi farlo anche nelle versioni precedenti usando EXP / IMP, ma ora è molto più semplice.)
Modificato per aggiungere se la tabella che stai cercando si trova in uno schema diverso:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
My_table_name
è la tabella esistente. Ma come faccio a creare il nome della mia nuova tabella?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
Nel frattempo, per favore fatemi sapere cosa fa LONG qui.
Utilizzando sql developer selezionare la tabella e fare clic sulla scheda DDL
È possibile utilizzare quel codice per creare una nuova tabella senza dati quando lo si esegue in un foglio di lavoro sql
sqldeveloper è un'app gratuita di Oracle.
Se la tabella ha sequenze o trigger, a volte ddl genererà anche quelli per te. Devi solo fare attenzione in quale ordine li fai e sapere quando attivare o disattivare i grilletti.
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;
Puoi farlo
Create table New_table as
select * from Old_table where 1=2 ;
ma fai attenzione
La tabella che crei dose non ha alcun indice, Pk e così via come la vecchia_tabella
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
Crea una nuova tabella vuota usando lo schema di un'altra. Basta aggiungere una clausola WHERE che non restituisce dati alla query:
Scrivi semplicemente una query come:
create table new_table as select * from old_table where 1=2;
dove si new_table
trova il nome della nuova tabella che si desidera creare ed old_table
è il nome della tabella esistente di cui si desidera copiare la struttura, verrà copiata solo la struttura.
WHERE 1 = 0
o simili condizioni false funzionano, ma non mi piace il loro aspetto. Il codice marginalmente più pulito per Oracle 12c + IMHO è
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
Si applicano le stesse limitazioni: solo le definizioni di colonna e la loro nullità vengono copiate in una nuova tabella.
In altro modo è possibile ottenere ddl della creazione della tabella dal comando elencato di seguito ed eseguire la creazione.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
è TABLE
, PROCEDURE
ecc.Con questo comando è possibile ottenere la maggior parte di ddl dagli oggetti del database.
GET_DDL
fanno distinzione tra maiuscole e minuscole.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table è la tabella di cui vuoi copiare la struttura.
Usando lo sviluppatore pl / sql è possibile fare clic con il tasto destro del mouse su table_name nell'area di lavoro sql o nell'esploratore oggetti, quindi fare clic su "view" e quindi su "view sql" che genera lo script sql per creare la tabella insieme a tutti i vincoli , indici, partizioni ecc.
Successivamente si esegue lo script utilizzando new_table_name
- crea la tabella xyz_new come seleziona * da xyz;
- Questo creerà una tabella e copierà tutti i dati.
- elimina da xyz_new;
- Questo avrà la stessa struttura della tabella ma tutti i dati copiati verranno eliminati.
Se si desidera superare i limiti specificati dalla risposta: Come posso creare una copia di una tabella Oracle senza copiare i dati?
L'attività sopra può essere completata in due semplici passaggi.
CREATE table new_table_name AS(Select * from old_table_name);
Quanto query
sopra crea un duplicato di una tabella (anche con i contenuti).
Per ottenere la struttura, eliminare il contenuto della tabella utilizzando.
DELETE * FROM new_table_name.
Spero che questo risolva il tuo problema. E grazie ai post precedenti. Mi ha dato molte intuizioni.
truncate
versione. Oltre ad allocare estensioni per tutti i dati, non li stai liberando eliminando, quindi stai potenzialmente sprecando spazio a meno che la tabella non raggiunga le dimensioni precedenti. E stai generando annulla / ripeti sia sull'inserimento che sull'eliminazione. La risposta di Jim evita semplicemente tutto ciò.