web-dev-qa-db-fra.com

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;

Qui copie la structure et les données, mais que se passe-t-il si je veux juste la structure?

260
Andrew

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:

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

Cela aussi ne gère pas les partitions


403
Jim Hudson

J'ai utilisé la méthode que vous avez souvent acceptée, mais comme quelqu'un l'a souligné, elle ne duplique pas les contraintes (sauf pour 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 de création que vous pouvez modifier si vous le souhaitez pour créer la nouvelle table. Il faudrait bien sûr changer les noms de la table et toutes les contraintes.

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

Edité à ajouter Si la table que vous recherchez est dans un schéma différent:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
83
Dave Costa

À l'aide de 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 a des séquences ou des déclencheurs, ddl les générera parfois aussi pour vous. Vous devez juste faire attention à l'ordre dans lequel vous les placez et savoir quand activer ou désactiver les déclencheurs.

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

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

14
sunleo
    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; 
4
Brian Leach

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

3
Mohsen Molaei
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

2
guesswho

Autrement, vous pouvez obtenir ddl de création de table à partir de la commande ci-dessous et exécuter la création.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPE est TABLE, PROCEDURE etc.

Avec cette commande, vous pouvez obtenir la majorité de ddl à partir d'objets de base de données.

1
Diogo Maschio

WHERE 1 = 0 ou de fausses conditions similaires fonctionnent, mais je n'aime pas leur apparence. Code légèrement 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 valeur NULL sont copiées dans une nouvelle table.

1
DKroot

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. Cette structure ne copie que la structure.

1
user3284249

vous pouvez aussi faire un

create table abc_new as select * from abc; 

puis tronquez la table abc_new. J'espère que cela suffira à vos besoins.

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

Source_table est la table dans laquelle vous voulez copier la structure.

0
Prashant Mishra
  1. créer la table xyz_new en tant que select * from xyz;

- Cela va créer une table et copier toutes les données.

  1. supprimer de xyz_new;

- Cela aura la même structure de table mais toutes les données copiées seront supprimées.

Si vous souhaitez surmonter les limitations spécifiées par la réponse: Comment puis-je créer une copie d'une table Oracle sans copier les données?

0

En utilisant pl/sql developer, vous pouvez cliquer avec le bouton droit de la souris sur le nom de la table dans l’espace de travail SQL ou dans l’explorateur d’objets, puis cliquer sur "afficher" et cliquer sur "afficher SQL" pour générer le script SQL permettant de créer le tableau avec toutes les contraintes. , index, partitions, etc.

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

0
Yariv Scheingut

copie sans données de table

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

copie avec les données de la table

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