IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Création colonne au millieu d'une table


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 30
    Par défaut Création colonne au millieu d'une table
    Bonsoir,

    Soit une table contenant les champs :
    - champ1
    - champ2

    Je voudrais au final avoir cela :
    - champ1
    - nouveauchamp
    - champ2

    Comment insérer un champ au millieu d'autres champs à l'aide d'une commande SQL :
    ALTER TABLE matable INSERT .....

    Je sais le faire avec Entreprise manager mais pas avec une commande SQL.

    Merci.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Ceci est PARFAITEMENT STUPIDE et contrevient à la notion même de base de données relationnelles dons la théorie repose sur une logique ensembliste. Or il n'existe aucune notio d'ordre implicite dans les ensembles.

    SQL n'a donc pas prévu (et heureusement) cette possibilité farfelue et grotesque.
    Si vous voulez faire cela, retourner à des fichiers. N'utilisez pas un SGBDR et évitez SQL !

    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L6

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 19
    Par défaut
    C'est faisable avec l'enterprise manager(SQL-2000) ou le management studio (SQL-2005)
    Il faut sélectionner le table puis choisir modify (ou edit) puis on peu faire un insert d'une colonne avec la touche insert du clavier (après avoir sélectionné le nom d'une colonne).

    L'insert d'une colonne ne fonctionne que de cette manière.
    J'ai déja envisagé de le faire via les tables système mais c'est beaucoup trop dangereux.
    Si qulqu'un a une méthode via script. Je suis preneur.

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Bien sûr que les outils graphiques le permettent.
    Mais qu'est ce qui ce passe en arrière plan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Begin Transaction
    Une nouvelle table est crée
    Les données sont copiées entre les deux tables
    La première table est supprimée
    La deuxième est renomée avec le nom de l'ancienne table.
    Commit Transaction
    En conclusion, nous n'avons qu'un contournement, mais ce n'est pas pris en charge par SQL directement.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    et bonjour la merde s'il y des des contraintes d'intégrité référentielle et du volume de données dans la table !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Surtout que cela ne t'apporte rien du tout, pour quoi se compliquer la vie avec des éléments de présentation ? ? ?

    Ajoute ta nouvelle colonne, puis crée une vue avec une présentaion et un ordre de colonne comme tu veux et le tour est joué !!!

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 30
    Par défaut
    Bonsoir,

    Ceux qui pratiquent les bases de données pourront imaginer le besoin.

    Il peut y avoir plusieurs raisons :
    - pour faire joli
    - pour éviter des problèmes lors de certaines requètes : select * from matable order by 3 (on ne maîtrise pas toujours les requètes faites par les utilisateurs)
    - ... (ajouter ici vos raisons)
    - pour mon besoin spécifique :

    j'ai créé un logiciel gratuit de comparaison de base de données (table, champs, vues, fonctions, procédures stockées, index, contraintes, triggers), je souhaite maintenant écrire le script pour "corriger" la/les bases qui ont des manquants ou des différences.
    C'est ici que je souhaiterai rajouter les champs "au milieu" de la table, je suis bien d'accord que c'est PARFAITEMENT STUPIDE et contrevient à la notion même de base de données relationnelles voire même farfelu et grotesque mais c'est bien plus carré et logique.

    Entreprise manager faisant cela, cela doit être possible.
    Est-ce que la seule solution est de dropper la table puis de la recréer ?

    Je n'ai jamais utilisé d'autres logiciels de synchronisation de base, comment font-ils ?

    Merci de vos réponses.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Par défaut
    Bonjour,

    au delà des remarques stupides et idiotes de SQL PRO (en tout cas dans la forme, je trouve incroyable d'agresser verbalement les gens de la sorte, et tu n'es pas le seul), je le rejoins, ainsi que WOLO, sur le fait que ce que tu demandes de faire est très compliqué à comprendre... Je parle du réel besoin.

    Les "order by 3", si tu ajoutes une colonne change bien sur le tri. Pourquoi ne pas simplement faire des comparaisons colonne à colonne en utilisant tout bêtement sysobjects et syscolumns et ajouter les colonnes "à la fin".

    Ensuite, si tu es sioux, tu peux t'amuser à changer l'ordre de la colonne dans la table syscolumns pour retrouver l'affichage initial mais d'abord c'est dangereux puis inutile.

    Il faut comprendre que les bases de données ne stockent absolument pas les données comme elles nous apparaissent en faisant un "select *,", en utilisant entreprise manager.
    Ce sont bien ces outils qui réorganisent l'affichage, mais physiquement, c'est absolument pas le cas. La preuve c'est que tu peux découper des bases sur plusieurs segments, mettre les logs à part, les indexs à part, ...

    Bref ce que nous voyons n'est qu'une vue de l'esprit de ce qui est physiquement sur les disques des serveurs. Un peu comme les fichiers quoi...

    Si tu veux faire un comparatif de bases, passe outre "l'ordre des colonnes". Ca n'apporte rien de mieux.

    Cdlt

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Bonjour bipcpp,

    vous n'avez visiblement RIEN compris aux SGBDR. Vous en êtes resté aux fichiers, et c'est bien dommage. Alors puisque j'enseigne les SGBDR et SQL à longueur de journée, juste un petit cours sur le sujet ...

    - pour faire joli
    NON, NON et RE NON ! Un SGBDR ne doit jamais s'occuper de faire de la présentation. Un SGDR est fait pour faire du traitement de données. Son but est de manipuler les données et de vous les restituer.
    Peu importe que les données soient à droite, à gauche, en rouge, en bleu en vert.... Si les données y sont, le but est atteint.
    C'est à d'autres outils de faire cela. Par exemple votre L4G ou encore un outil de présentation (serveur WEB)
    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

    Il ne vous viendrait pas à l'esprit de prendre une moto pour faire un déménagement ? Or là vous prenez SQL pour faire de la peinture !

    - pour éviter des problèmes lors de certaines requètes : select * from matable order by 3 (on ne maîtrise pas toujours les requètes faites par les utilisateurs)
    ERREUR MAGISTRALE !

    Sachez qu'en AUCUN CAS, avec le SELECT *, vous aurez l'assurance que le SGBDR vous ramenera les colonnes dans l'ordre dans lesquelles vous les avez créées. En effet vous indiquez à l'aide de l'étoile au SGBDR la chose suivante :
    rapporte moi toutes les colonnes de la table ... dans l'ordre que tu voudra !
    Aucun SGBDR ne peut offrir la garantie que la même requête en SELECT * présentera les données de la même façon même si la requête est jouée deux fois de suite... Cela fait d'ailleurs partie intégrante de la norme SQL !

    - pour mon besoin spécifique :
    j'ai créé un logiciel gratuit de comparaison de base de données (table, champs, vues, fonctions, procédures stockées, index, contraintes, triggers), je souhaite maintenant écrire le script pour "corriger" la/les bases qui ont des manquants ou des différences.
    Si vous avez basé votre logiciel sur une telle logique ce sera une catastrophe de l'utiliser. Il ne fonctionnera pas dans certains cas. heureusement qu'il est gratuit car sans cela vous pourriez être attaqué pour malfaçon !

    Je n'ai jamais utilisé d'autres logiciels de synchronisation de base, comment font-ils ?
    Voila la seule bonne question !
    Ils utilisent le SGBDR et SQL comme prévu c'est à dire en faisant des opérations ensemblistes autrement dit en utilisant des requêtes SQL.

    Rien de plus simple que de savoir si deux tables n'ont pas les mêmes colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COLUMN_NAME, COUNT(*)
    FROM   INFORMATION_SCHEMA.COLUMNS
    WHERE  TABLE_SCHEMA +'.'+ TABLE_NAME 
           IN ('dbo.Table1', 'dbo.table2')
    GROUP  BY  COLUMN_NAME, 
    HAVING COUNT(*) <> 2
    le résultat de cette requête donne les colonnes que dbo.Table1' à en plus que dbo.table2 ou l'inverse.

    Bref commencez par apprendre les principes ghénéraux des bases de données relationnelles, apprenez le langage SQL. Mon site comme mes bouquins peuvent vous y aider !


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 30
    Par défaut
    Bonsoir,

    Je me répond à moi-même.
    Après quelques recherches sur le net, c'est possible mais assez compliqué.
    En tout cas sur SQL Serveur, car MySQL possède une commande :
    ALTER TABLE ... ADD COLUMN ... AFTER nom_colonne
    (lien : http://doc.domainepublic.net/mysql/d...ter-table.html)

    Le travail fait par Entreprise Manager pour insérer une colonne au milieu de la table est détaillé en anglais ici :
    http://databases.aspfaq.com/general/...structure.html

    Merci pour vous être intéressé à ma question.

  11. #11
    Invité de passage
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1
    Par défaut J'avoue...
    J'avoue, moi aussi j'aime créer mes colonnes au bon endroit.
    Je n'en ai pas honte.

    SQLPro : Je vais me faire insulter aussi ? je devrais consulter ? lire votre livre ?
    ZERS : Tant mieux si le SGBD stocke les données de manière optimisée dans le disque. Moi ce qui m'importe ce n'est pas la "boîte noire", c'est ce que je vois en sortie.

    Quand je crée un logiciel pour un utilisateur, je lui présente les données dans l'IHM de manière claire et compréhensible.
    Quand j'utilise un SGBDR, je suis l'utilisateur de celui qui a conçu le SGBDR, donc j'exige que les données me soient présentées de manière claire et compréhensible.

    Si j'ajoute une colonne pour le deuxième prénom, je veux qu'elle apparaisse après le prénom quand je fais un SELECT * pour voir le contenu de ma table.
    Et je ne connais aucun SGBD qui renvoie les colonnes dans un ordre aléatoire lorsque l'on fait un SELECT * (SQL Server, MySQL, PostgreSQL, H2 Database, MS Access, FoxPro), il faut arrêter de plaisanter.

    La norme SQL et les théories ensemblistes sont une chose, tout cela s'applique au moteur du SGBDR, d'accord avec vous.
    Mais l'ordre des colonnes à l'écran, elle, vient d'une couche "présentation" de ce moteur, puisque comme vous l'avez dit, il n'y a pas d'ordre dans un ensemble... ça n'a donc rien à voir, donc merci de cesser avec vos "vous n'avez RIEN COMPRIS aux SGBDR, vous en êtes restés au FICHIERS..." ... ri-di-cule.

    En conclusion, SQLPRO, vous n'aviez peut-être pas pensé qu'il y avait aussi une couche de présentation dans les SGBDR ? (je fais référence à une architecture logicielle en couches si vous souhaitez vous documenter sur le sujet)

    Allez, sans rancune et bonne journée, mais essayez d'être beaucoup moins agressifs quand vous dispensez votre savoir.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 543
    Billets dans le blog
    10
    Par défaut
    Attention : si vous modifiez votre table en ajoutant une colonne au milieu, ou tout simplement en modifiant la longueur ou le type d'une colonne existante, vous compromettez l'utilisation d'anciennes sauvegardes qui ne pourront plus être rechargées

    Donc, même si je réprouve aussi la forme des remarques de certains contributeurs, sur le fond, je les rejoins à 100% :
    Une base de données doit être pérenne et sécurisée, compromettre les backup/restore pour un simple confort d'utilisation de select * est une erreur
    Sans compter que select * devrait être interdit dans les applications (c'est le plus souvent le cas d'ailleurs)

  13. #13
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Le simple fait de vouloir obtenir des colonnes "dans le bon ordre" à l'aide d'un SELECT * est une erreur.

    Le * ne sert qu'à deux choses :
    - Dans le COUNT(*)
    - A faire des tests de bidouilles quand on ne connait pas le MCD

    Pour le reste, on indique toujours le nom des colonnes retournées, ne serait-ce que pour éviter de charger des colonnes de type varchar(max) ou autres BLOB inutilement ! (bonjour la charge IO et réseau)

  14. #14
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Il y a aussi le EXISTS() qui est optimisé pour l'utilisation de *

    Dans tous les cas, le SELECT doit spécifier les colonnes à retourner, que l'on ajoute la colonne "à la fin" ou "au milieu" de la table.

    @++

  15. #15
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 504
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 504
    Par défaut
    Je rajoute ma petite goutte. L'utilisation du ORDER BY 1,2, ... est à utiliser seulement pour de la requête a mains levé juste pour regarder une info dans une table.
    En aucun cas ça doit être utilisé en développement. J'en ai vu ce faire jeter à cause de ça.

    Après, je peux comprendre qu'il y ait un besoin d'ordonner des colonnes selon sa logique. Au mieux il faut le faire lors de la conception de la table au pire, un bricolage qui consiste à stocker les données dans une table 2. Détruire la table 1 et la reconstruire mais c'est une très mauvaise idée aussi lié au référence. Le manager fait plus ou moins la même chose. Il suffit de regarder le script générer pour faire le changement de position. SQLPro à raison, c'est une chose illogique SQL Server n'est pas Acces. Je vais reprendre un exemple de SQLPro encore, il faut voir les champs stockés comme des billes dans un sac, c'est pareille pour les enregistrements. Il y a pas de sens

  16. #16
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pourtant quand on secoue bien le sac, les grosses billes descendent au fond et les petites remontent :o

    (ok, je sors )

  17. #17
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Je rejoins SQLPRO, vous vous enterrez post après post! non sql ne propose pas de "couche graphique" c'est le code client (dot net ou autre) ou du report par exemple mais SQL SERVER est indépendant de tout ca il expose ses données par l'intermédiaire d'un langage. vous confondez tout!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'une colonne à l'interieur d'une table .
    Par silset dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/11/2009, 10h05
  2. recuperer la colonne clé primaire d'une table
    Par mapmip dans le forum ASP.NET
    Réponses: 3
    Dernier message: 09/01/2009, 18h36
  3. [A-07] création de bouton pour ouvrir une table
    Par Pinkstorm dans le forum IHM
    Réponses: 1
    Dernier message: 08/12/2008, 13h22
  4. Réponses: 4
    Dernier message: 07/10/2007, 20h39
  5. Réponses: 4
    Dernier message: 07/10/2007, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo