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
flong72 - 12 févr. 2010 à 14:24
A voir également:
- Copier une table sans ses contraintes
- Table ascii - Guide
- Table des matières word - Guide
- Comment copier une vidéo youtube - Guide
- Super copier - Télécharger - Gestion de fichiers
- Copier texte pdf - Guide
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
2 janv. 2010 à 11:20
Si tu es sous Oracle, il y un moyen.
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
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 :
mais il ne passe pas...
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...
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
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 ?
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 ?
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
2 janv. 2010 à 17:07
Voici la suite de l'ordre qui décrit la table à copier à partir du dictionnaire Oracle :
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)
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)
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
2 janv. 2010 à 17:32
Enfin pour l'ordre de création de la table, voici une solution :
sous sqlplus :
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 ;-)
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 ;-)
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
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
seulement dire
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
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
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.
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.
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
2 janv. 2010 à 18:43
super merci bcp very goodGuitarist ;-)
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
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 :
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 ;-)))
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 ;-)))
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
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 ;-)
J'ai tout noté mais c'est bien plus que mon niveau de débutant ... justement j'ai tout noté pour en apprendre plus ;-)
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.
-- 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.