Copier une table sans ses contraintes

Résolu
codeForEver Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -  
 flong72 -
Bonjour,

Pour copier une table sans son contenu ni ses contraintes,

avec ce qui est dit ici :
https://forums.commentcamarche.net/forum/affich-890940-sql-copier-une-table-dans-une-autre

la table est bien créée mais les contraintes sont copiées et je les supprime manuelle :-(

est-ce quelqu'un connait une astuce ?
merci pour toute réponse :-)
A voir également:

10 réponses

BadGuitarist Messages postés 367 Date d'inscription   Statut Membre Dernière intervention   27
 
Si tu es sous Oracle, il y un moyen.
0
codeForEver Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour

Merci de ta réponse.
Je suis sous Oracle (version partiuculier pour étude mais il est complet).

J'avais essayé avec :
select into newTable
from oldTable;

mais il ne passe pas...
0
BadGuitarist Messages postés 367 Date d'inscription   Statut Membre Dernière intervention   27
 
Oh là ... si tu ne veux pas suivre la très bonne astuce que tu as donné en lien,
alors la solution est beaucoup plus compliquée :
l'idée est de rechercher les informations décrivant la table à copier (appelons-la TabACopier) dans les tables du dictionnaire de données Oracle.

As-tu vraiment besoin de cela ?
0
BadGuitarist Messages postés 367 Date d'inscription   Statut Membre Dernière intervention   27
 
Voici la suite de l'ordre qui décrit la table à copier à partir du dictionnaire Oracle :

  SELECT column_name, data_type, data_length, data_precision, data_scale, nullable
    FROM dba_tab_columns
    WHERE table_name = 'tableACopier';


Je te laisse regarder la table dba_tab_columns : elle rassemble beaucoup d'autres informations très intéressantes sur nos tables ;-)

Mais jusque là, on n'a pas encore la solution au problème, à savoir copier la structure (et uniquement la structure) de la table tableACopier.

Pour cela, il faut lancer un ordre CREATE TABLE ...

@+ (je continue mon étude)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BadGuitarist Messages postés 367 Date d'inscription   Statut Membre Dernière intervention   27
 
Enfin pour l'ordre de création de la table, voici une solution :

sous sqlplus :
spool c:\temp\creationNouvelleTable.sql
  SELECT ordreSQL
  FROM ( SELECT 'CREATE TABLE nouvelleTable (' ordreSQL, 1 ordre
                FROM DUAL
              UNION
              SELECT   column_name || '    '
                            || DECODE(data_type,
                                                'VARCHAR2', data_type || '('||data_length||')',
                                                                   data_type) || ', ' ordreSQL, 2 ordre 
                 FROM dba_tab_columns
                 WHERE table_name = 'tableACopier'
              UNION
              SELECT '); ' ordreSQL, 3 ordre
                 FROM DUAL
             ORDER BY ordre 
           );
spool off


Dans le fichier c:\temp\creationNouvelleTable.sql, tu trouveras l'ordre SQL de création de la table à ceci près :
il te faut encore enlever la virgule qui se trouve sur la dernière ligne de déclaration des colonnes.

Je crois que la solution que tu as donné est tout de même beaucoup plus simple, non ?
Même s'il te faut supprimer quelque contrainte à la mano ;-)
0
codeForEver Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
Merci bcp de ta (tes) réponse,

en fait je voulais bien suivre la bonne astuce que le lien donne mais j'avais compris qu'on pouvait copier une table sans ses contraintes...

Je te remercie pour le code du dictionnaire Oracle que je ne connais pas du tout (hyper débutante...)

petite question : sur la clause select on peut donc choisir "quoi" sélectionner ??

par exemple au lieu de
 SELECT column_name, data_type, data_length, data_precision, data_scale, nullable

seulement dire
 SELECT column_name, data_type, data_length
0
BadGuitarist Messages postés 367 Date d'inscription   Statut Membre Dernière intervention   27
 
Oui.

Derrière le mot clé SELECT,
tu listes toutes les colonnes que tu juges utiles et qui sont présentes dans les objets (tables, vues, ...) de ta clause FROM.
Les colonnes que tu listes dans ta clause SELECT permettent d'afficher les informations contenues dans celles-ci à condition bien sûr qu'elles respectent ta clause WHERE.
0
codeForEver Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
super merci bcp very goodGuitarist ;-)
0
BadGuitarist Messages postés 367 Date d'inscription   Statut Membre Dernière intervention   27
 
Ben ... comme le post n'est pas encore clos, je me permets d'améliorer la solution que j'avais donnée pour générer l'ordre de copie d'une table. Voici donc une meilleure solution :

sous sqlplus :

spool c:\temp\creationNouvelleTable.sql
  SELECT ordreSQL
  FROM ( SELECT 'CREATE TABLE nouvelleTable (' ordreSQL, 1 ordre
                FROM DUAL
              UNION
              SELECT   DECODE(rownum,
                                            1,   column_name || '    '
                                                  || DECODE(data_type,
                                                                      'VARCHAR2', data_type || '('||data_length||')',
                                                                                         data_type) ,
                                                  ', ' || column_name || '    '
                                                       || DECODE(data_type,
                                                                          'VARCHAR2', data_type || '('||data_length||')',
                                                                                             data_type)
                                       ) ordreSQL, 2 ordre 
                 FROM dba_tab_columns
                 WHERE table_name = 'tableACopier'
              UNION
              SELECT '); ' ordreSQL, 3 ordre
                 FROM DUAL
             ORDER BY ordre 
           );
spool off


Dans le fichier c:\temp\creationNouvelleTable.sql, tu trouveras l'ordre SQL de création de la table.

Quelques autres améliorations sont encore possible :
- donner la possibilité à l'utilisateur de donner le nom de la table à copier
- de mieux gérer les colonnes dont les types ne sont ni VARCHAR2 ni NUMBER.

Pour moi, fini ... je n'en rajoute plus sauf s'il y a demande bien sûr ;-)))
0
codeForEver Messages postés 16 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup :-)))

J'ai tout noté mais c'est bien plus que mon niveau de débutant ... justement j'ai tout noté pour en apprendre plus ;-)
0
flong72
 
On parle bien de Oracle n'est-ce pas?

-- pour copier la table avec ses données :
Create table MaTableCopie as select * from MaTableSource;

-- pour copier juste la structure :
Create table MaTableCopie as select * from MaTableSource where 1=0;

Il me semble que ces requètes ne copie pas les indexes et contraintes.

J'ai personellement un problème beaucoup plus compliqué, car les requètes ci-dessus ne semble pas fonctionner avec des type de champ particulier.

J'ai une table a copier avec un champ de type XMLType. Ca ne marche pas.

Donc j'aimerai savoir si qlq à une proc. stockée capable de générer les creates qui vont bien et surtout transférer ces type de données.

Ca serait vraiment cool si qlq avait une soluce.
0