Question

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 ne veux que la structure?

Était-ce utile?

La solution

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

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

Limitations

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

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

Cela ne gère pas non plus les partitions

Autres conseils

J'ai utilisé la méthode selon laquelle vous aviez beaucoup accepté, mais comme quelqu'un l'a fait remarquer, 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 la déclaration de création que vous pourrez modifier à votre guise pour créer la nouvelle table. Vous devrez 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 correspond à un autre schéma:

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

À 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 oracle.

Si la table a des séquences ou des déclencheurs, ddl les générera parfois aussi pour vous. Vous devez simplement faire attention à l'ordre dans lequel vous les placez et savoir quand activer ou désactiver les déclencheurs.

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

    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; 

Vous pouvez le faire Créer la table New_table en tant que   select * from Old_table où 1 = 2; mais faites attention   La table que vous créez n'a pas d'index, de Pk, etc. comme l'ancienne table

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 pour que la requête ne retourne aucune donnée:

Écrivez simplement une requête du type:

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, cela copiera seule structure.

WHERE 1 = 0 ou de fausses conditions similaires fonctionnent, mais je n'aime pas leur apparence. Le code légèrement plus propre pour Oracle 12c + IMHO est

CREATE TABLE bar AS   SELECT *   DE foo   FETCH FIRST 0 ROWS UNIQUEMENT;

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

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.

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

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

En utilisant pl / sql developer, vous pouvez cliquer avec le bouton droit de la souris sur le nom de la table, soit dans l’espace de travail SQL, soit dans l’explorateur d’objets, puis cliquez sur "afficher". et puis cliquez sur "view 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 new_table_name

Autrement, vous pouvez obtenir ddl de la 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 is ('TABLE','PROCEDURE', etc...)

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

copier sans les données de la table

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

copier avec les données de la table

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

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

La requête ci-dessus crée un duplicata d'une table (avec le contenu également).

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

ÉTAPE 2:

DELETE * FROM new_table_name.

J'espère que cela résoudra votre problème. Et merci aux messages précédents. M'a donné beaucoup de perspicacité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top