289 votes

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

Je connais la déclaration :

create table xyz_new as select * from xyz;

Ce qui copie la structure et les données, mais que faire si je ne veux que la structure ?

1 votes

447voto

Jim Hudson Points 3349

Il suffit d'utiliser une clause where qui ne sélectionne 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
  • indices
  • certaines contraintes peuvent ne pas être copiées
  • journaux des vues matérialisées

Cela ne gère pas non plus les partitions


55 votes

C'est une réponse très claire. Je veux juste rappeler que cela pas inclure des contraintes la nouvelle table n'aura même pas de clé primaire.

19 votes

Cela ne reproduira pas non plus les séquences ou les déclencheurs.

16 votes

La nouvelle table n'aura pas non plus d'index - ne vous faites pas surprendre en essayant de faire une grosse requête sur la nouvelle table :-)

87voto

Dave Costa Points 25282

J'ai beaucoup utilisé la méthode que vous avez acceptée, mais comme quelqu'un l'a fait remarquer, elle ne duplique pas les contraintes (sauf pour NOT NULL, je crois).

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;

Vous obtiendrez ainsi le texte complet de l'instruction de création, que vous pourrez modifier comme vous le souhaitez pour créer la nouvelle table. Vous devrez bien sûr changer les noms de la table et toutes les contraintes.

(Vous pouviez é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;

0 votes

Comment cette commande sera-t-elle modifiée si je veux copier à partir d'un autre schéma ?

0 votes

My_table_name est la table existante. Mais comment puis-je obtenir le nom de ma nouvelle table créée ?

0 votes

La commande dans ma réponse ne crée pas la nouvelle table ; elle renvoie le SQL que vous utiliseriez pour recréer la table originale. Vous le modifiez comme vous le souhaitez puis vous l'exécutez. Le nom de la nouvelle table est donc celui que vous choisissez de spécifier.

16voto

branchgabriel Points 2436

En utilisant sql developer, 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 d'oracle.

Si la table comporte 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.

2 votes

Dans Oracle SQL Developer v.18.3, l'onglet est appelé SQL

16voto

sunleo Points 2430
create table xyz_new as select * from xyz where rownum = -1;

Pour éviter d'itérer encore et encore et de ne rien insérer en fonction de la condition où 1=2

1voto

user3284249 Points 11

Il suffit d'écrire une requête comme :

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

new_table est le nom de la nouvelle table que vous voulez créer et old_table est le nom de la table existante dont vous voulez copier la structure, ceci ne copiera que la structure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X