Copier une table sans ses contraintes

Résolu/Fermé
codeForEver Messages postés 16 Date d'inscription vendredi 1 janvier 2010 Statut Membre Dernière intervention 1 novembre 2011 - 1 janv. 2010 à 20:13
 flong72 - 12 févr. 2010 à 14:24
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 dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
2 janv. 2010 à 11:20
Si tu es sous Oracle, il y un moyen.
0
codeForEver Messages postés 16 Date d'inscription vendredi 1 janvier 2010 Statut Membre Dernière intervention 1 novembre 2011
2 janv. 2010 à 15:31
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 dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
2 janv. 2010 à 16:41
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 dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
2 janv. 2010 à 17:07
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 dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
2 janv. 2010 à 17:32
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 vendredi 1 janvier 2010 Statut Membre Dernière intervention 1 novembre 2011
2 janv. 2010 à 17:39
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 dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
2 janv. 2010 à 17:46
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 vendredi 1 janvier 2010 Statut Membre Dernière intervention 1 novembre 2011
2 janv. 2010 à 18:43
super merci bcp very goodGuitarist ;-)
0
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
5 janv. 2010 à 02:32
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 vendredi 1 janvier 2010 Statut Membre Dernière intervention 1 novembre 2011
6 janv. 2010 à 00:14
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
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