Copier une table sans ses contraintes
Résolu
codeForEver
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
flong72 -
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 :-)
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:
- 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
- Historique copier coller - Guide
10 réponses
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...
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 ?
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
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 ;-)
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
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.
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 ;-)))
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.