Come posso creare una copia di una tabella Oracle senza copiare i dati?


Risposte:


420

Basta usare una clausola where che non selezionerà alcuna riga:

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

limitazioni

Le seguenti cose non verranno copiate nella nuova tabella:

  • sequenze
  • trigger
  • indici
  • alcuni vincoli potrebbero non essere copiati
  • registri di visualizzazione materializzati

Anche questo non gestisce le partizioni



53
Questa è una risposta eccellente e chiara. Voglio solo ricordare che questo non includerà alcun vincolo .. la nuova tabella non avrà nemmeno una chiave primaria.
JosephStyons,

18
questo non replicherà neanche sequenze o trigger.
branchgabriel,

16
né il nuovo tavolo avrà alcun indice - non
lasciarti

8
inoltre non gestisce le partizioni. Ma hey.
MK.

17
Basta un addendum - è sarà conterrà alcuni vincoli - cioè qualsiasi vincoli NOT NULL verrà copiato.
Jeffrey Kemp,

84

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;

Come verrà modificato questo comando se voglio copiarlo da un altro schema?
kushalvm,

My_table_nameè la tabella esistente. Ma come faccio a creare il nome della mia nuova tabella?
kushalvm,

Il comando nella mia risposta non crea la nuova tabella; restituisce l'SQL che useresti per ricreare la tabella originale. Lo si modifica come desiderato, quindi eseguirlo. Quindi il nome della nuova tabella è qualunque cosa tu scelga di specificare.
Dave Costa,

5
Quindi deve essere come assegnare il comando sql sopra a una variabile. ryt? per esempio . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Nel frattempo, per favore fatemi sapere cosa fa LONG qui.
kushalvm,

15

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.


In Oracle SQL Developer v.18.3 la scheda è chiamataSQL
Metafaniel

14
create table xyz_new as select * from xyz where rownum = -1;

Per evitare ripetute ripetizioni e non inserire nulla in base alla condizione in cui 1 = 2


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; 

3

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


2
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:


1

puoi anche fare un

create table abc_new as select * from abc; 

quindi tronca la tabella abc_new. Spero che questo sia sufficiente per le tue esigenze.


11
Naturalmente, se nella tabella originale sono presenti MOLTI dati, questa potrebbe essere una pessima idea. ;)
Alessio,

1

Scrivi semplicemente una query come:

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

dove si new_tabletrova 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.


1

WHERE 1 = 0o 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.


1

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, PROCEDUREecc.

Con questo comando è possibile ottenere la maggior parte di ddl dagli oggetti del database.


Si noti che gli argomenti GET_DDLfanno distinzione tra maiuscole e minuscole.
Sridhar Sarnobat,

0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table è la tabella di cui vuoi copiare la struttura.


0

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


0

copia senza i dati della tabella

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

copia con i dati della tabella

create table <target_table> as select * from <source_table>;


-5

L'attività sopra può essere completata in due semplici passaggi.

PASSO 1:

CREATE table new_table_name AS(Select * from old_table_name);

Quanto querysopra crea un duplicato di una tabella (anche con i contenuti).

Per ottenere la struttura, eliminare il contenuto della tabella utilizzando.

PASSO 2:

DELETE * FROM new_table_name.

Spero che questo risolva il tuo problema. E grazie ai post precedenti. Mi ha dato molte intuizioni.


13
Questo è ancora meno efficiente della truncateversione. 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ò.
Alex Poole,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.