Comment créer une copie d'une table Oracle sans copier les données?
-
04-07-2019 - |
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?
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;
où 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é.