Réponses:
Utilisez simplement une clause where qui ne sélectionnera aucune ligne:
create table xyz_new as select * from xyz where 1=0;
Les éléments suivants ne seront pas copiés dans la nouvelle table:
Cela ne gère pas non plus les partitions
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;
My_table_name
est la table existante. Mais comment puis-je créer le nom de ma nouvelle table?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
En attendant, faites-moi savoir ce que fait LONG ici.
À 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.
SQL
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
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
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:
Écrivez simplement une requête comme:
create table new_table as select * from old_table where 1=2;
où new_table
est le nom de la nouvelle table que vous souhaitez créer et old_table
le nom de la table existante dont vous souhaitez copier la structure, cela copiera uniquement la structure.
WHERE 1 = 0
ou 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.
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
TYPE
est TABLE
, PROCEDURE
etc.Avec cette commande, vous pouvez obtenir la majorité des ddl des objets de base de données.
GET_DDL
sont sensibles à la casse.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table est la table dont vous voulez copier la structure.
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
- créer la table xyz_new en tant que select * from xyz;
- Cela va créer un tableau et copier toutes les données.
- supprimer de xyz_new;
- Cela aura la même structure de tableau 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?
La tâche ci-dessus peut être effectuée en deux étapes simples.
CREATE table new_table_name AS(Select * from old_table_name);
Ce qui query
pré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.
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é.
truncate
version. 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.