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?
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 aussi ne gère pas les partitions
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;
À 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.
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 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
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:
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.
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.
Il suffit d'écrire 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 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.
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 dans laquelle vous voulez copier la structure.
- créer la table xyz_new en tant que select * from xyz;
- Cela va créer une table et copier toutes les données.
- 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?
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
create table <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <source_table>;