Comment puis-je créer une copie d'une table Oracle sans copier les données?

Réponses:

420

Utilisez simplement une clause where qui ne sélectionnera aucune ligne:

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

Limites

Les éléments suivants ne seront pas copiés dans la nouvelle table:

  • séquences
  • déclencheurs
  • index
  • certaines contraintes peuvent ne pas être copiées
  • journaux de vues matérialisées

Cela ne gère pas non plus les partitions


Jim Hudson
la source
53
C'est une excellente réponse claire. Je veux juste rappeler que cela ne comprend aucune contrainte .. la nouvelle table sera même pas une clé primaire.
JosephStyons
18
cela ne répliquera pas non plus les séquences ou les déclencheurs.
branchgabriel
16
la nouvelle table n'aura pas non plus d'index - ne vous
laissez
8
ne gère pas non plus les partitions. Mais salut.
MK.
17
Juste un additif - il va contenir des contraintes - à savoir toute contraintes NOT NULL sera copié.
Jeffrey Kemp
84

J'ai utilisé la méthode que vous avez beaucoup acceptée, mais comme quelqu'un l'a souligné, elle ne fait pas double emploi avec les contraintes (sauf NOT NULL, je pense).

Une méthode plus avancée si vous souhaitez dupliquer la structure complète est la suivante:

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

Cela vous donnera le texte complet de l'instruction create que vous pouvez modifier à votre guise pour créer la nouvelle table. Il faudrait bien sûr changer les noms de la table et toutes les contraintes.

(Vous pouvez également le faire dans les anciennes versions en utilisant EXP / IMP, mais c'est beaucoup plus facile maintenant.)

Modifié pour ajouter Si la table que vous recherchez se trouve dans un schéma différent:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
Dave Costa
la source
Comment cette commande va-t-elle être modifiée si je veux copier à partir d'un autre schéma.
kushalvm
My_table_nameest la table existante. Mais comment puis-je créer le nom de ma nouvelle table?
kushalvm
La commande dans ma réponse ne crée pas la nouvelle table; il renvoie le SQL que vous utiliseriez pour recréer la table d'origine. Vous le modifiez comme vous le souhaitez puis l'exécutez. Ainsi, le nom de la nouvelle table est celui que vous choisissez de spécifier.
Dave Costa
5
Donc, cela doit être comme affecter la commande sql ci-dessus à une variable. ryt? par exemple . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). En attendant, faites-moi savoir ce que fait LONG ici.
kushalvm
15

À l'aide du développeur SQL, sélectionnez la table et cliquez sur l'onglet DDL

Vous pouvez utiliser ce code pour créer une nouvelle table sans données lorsque vous l'exécutez dans une feuille de calcul SQL

sqldeveloper est une application gratuite à partir d'Oracle.

Si la table contient des séquences ou des déclencheurs, le ddl les génère parfois aussi pour vous. Vous devez juste faire attention à l'ordre dans lequel vous les faites et savoir quand activer ou désactiver les déclencheurs.

branchgabriel
la source
Dans Oracle SQL Developer v.18.3, l'onglet est appeléSQL
Metafaniel
14
create table xyz_new as select * from xyz where rownum = -1;

Pour éviter de répéter encore et encore et de ne rien insérer en fonction de la condition où 1 = 2

sunleo
la source
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
la source
3

Vous pouvez le faire Create table New_table as select * from Old_table where 1=2 ; mais faites attention La table que vous créez n'a pas d'index, Pk et ainsi de suite comme l'ancienne table

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

Créez une nouvelle table vide en utilisant le schéma d'une autre. Ajoutez simplement une clause WHERE qui fait que la requête ne renvoie aucune donnée:

devine qui
la source
1

vous pouvez aussi faire un

create table abc_new as select * from abc; 

puis tronquez le tableau abc_new. J'espère que cela suffira à vos besoins.

Digo
la source
11
Bien sûr, si vous avez BEAUCOUP de données dans la table d'origine, cela pourrait être une très, très mauvaise idée. ;)
Alexios
1

Écrivez simplement une requête comme:

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

new_tableest le nom de la nouvelle table que vous souhaitez créer et old_tablele nom de la table existante dont vous souhaitez copier la structure, cela copiera uniquement la structure.

user3284249
la source
1

WHERE 1 = 0ou de fausses conditions similaires fonctionnent, mais je n'aime pas à quoi elles ressemblent. Le code marginalement plus propre pour Oracle 12c + IMHO est

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

Les mêmes limitations s'appliquent: seules les définitions de colonne et leur nullité sont copiées dans une nouvelle table.

DKroot
la source
1

D'une autre manière, vous pouvez obtenir un ddl de création de table à partir de la commande répertoriée ci-dessous et exécuter la création.

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

Avec cette commande, vous pouvez obtenir la majorité des ddl des objets de base de données.

Diogo Maschio
la source
Notez que les arguments de GET_DDLsont sensibles à la casse.
Sridhar Sarnobat
0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table est la table dont vous voulez copier la structure.

Prashant Mishra
la source
0

En utilisant le développeur pl / sql, vous pouvez cliquer avec le bouton droit sur le nom_table dans l'espace de travail sql ou dans l'explorateur d'objets, puis cliquer sur "voir" et cliquer sur "voir sql" qui génère le script sql pour créer la table avec toutes les contraintes , index, partitions etc.

Ensuite, vous exécutez le script en utilisant le nouveau_nom_table

Yariv Scheingut
la source
0

copier sans données de table

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

copier avec les données du tableau

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

La tâche ci-dessus peut être effectuée en deux étapes simples.

ÉTAPE 1:

CREATE table new_table_name AS(Select * from old_table_name);

Ce qui queryprécède crée un doublon d'une table (avec son contenu également).

Pour obtenir la structure, supprimez le contenu du tableau à l'aide de.

ÉTAPE 2:

DELETE * FROM new_table_name.

J'espère que ceci résoudra votre problème. Et grâce aux articles précédents. M'a donné beaucoup de perspicacité.

Donkha
la source
13
C'est encore moins efficace que la truncateversion. En plus d'allouer des extensions pour toutes les données, vous ne les libérez pas en les supprimant, vous perdez donc potentiellement de l'espace à moins que la table ne prenne sa taille d'origine. Et vous générez annuler / rétablir sur l'insertion et la suppression. La réponse de Jim évite tout simplement tout cela.
Alex Poole