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



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;

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.


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


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

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


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:


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.


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.


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.


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.


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.


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


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>;


-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é.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.