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 :

Convertir un champ numeric(5,0) en identity


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut Convertir un champ numeric(5,0) en identity
    Bonjour à tous,

    Je récupère une base de donnée que je dois modifier pour l'optimiser. Sa structure est la suivante :

    15 tables comportant chacune une clef primaire de type numeric(5,0).

    Suivant les besoins, les tables sont reliées entre elles, avec transfert de clefs primaires et/ou créations de tables jointes.

    Les tables sont actuellement remplies de données (en gros 10 lignes pour la plus petite et 20 000 pour la plus grosse).

    Maintenant voici ma question :

    - Est-il possible de modifier la structure des tables via un ALTER TABLE..... pour que la clef primaire de chaque table soit modifiée de Num(5,0) en IDENTITY ?

    - Si cela n'est pas possible comment faire en sorte lors de l'insertion de données dans une table que la clef primaire s'auto-incrémente. Je veux dire par là que l'utilisateur ne remplit pas ce champ puisqu'il ne le voit pas.

    Voilà, j'espère que vous pourrez m'aider.

    Bonne journée à tous.

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    1ere méthode : utiliser las valeurs de la colonne numeric(5,0)
    -----------

    --> 1.) Créer une table temporaire ayant la structure souhaitée (avec colonne IDENTITY)
    --> 2.) Désactiver l'autoincrément avec la commande SET IDENTITY_INSERT TableTemporaire ON
    --> 3.) Importer des données de la table initiale (table avec colonne numeric(5,0)) vers la table temporaire
    --> 4.) Supprimer les clées primaires (PK) et étrangères (FK) de la table initiale
    --> 5.) Renommer la table initiale
    --> 6.) Renommer la table temporaire en lui donnant le même nom que la table initiale
    --> 7.) Ajouter les clés primaires (PK) et étrangères (FK) à cette nouvelle table
    --> 8.) Activer l'autoincrément sur la nouvelle table avec la commande SET IDENTITY_INSERT TableTemporaire OFF

    2ème méthode : ne pas utiliser les valeurs de la colonne numeric(5,0)
    ------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    -- table avec les données
    SELECT 'Table initiale'
    create table t (col_numeric numeric(5,0))
    insert into t values(1),(2),(3)
    select * from t;
    -- Ajout de la colonne IDENTITY
    SELECT 'Ajout de la colonne IDENTITY'
    alter table t add col_identity INT IDENTITY (1,1);
    select * from t
    -- suppression de la colonne c(numeric(5,0))
    SELECT 'suppression de la colonne c(numeric(5,0))'
    alter table t drop column col_numeric;
     
    select * from t
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut
    Salut zinzineti,

    Je te remercie de ta réponse quoi qu'elle ne m’apparaisse pas très simple.

    En fouillant, l'ensemble des articles de Brouard, je suis tombé sur un truc assez classe : Les tables des clefs. Mais j'avoue que ses explications sont plus que brumeuses pour moi.

    Ne serait-ce pas la méthode la plus "orthodoxe" pour réaliser ce genre de manipulation ?

  4. #4
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 321
    Par défaut
    Salut,

    Après plusieurs heures de travail et de compréhension, je suis arrivé à faire les modifications voulu avec la première méthode....
    Du coup tout fonctionne parfaitement.

    Maintenant et pendant que j'y suis, j'essaie de recommencer la procédure de zéro en créant une table des clefs. Donc toutes mes tables n'auront pas de clefs primaires séquentielles mais uniquement numériques.
    Bref je suis l'article de Brouard la dessus et je galère un peu.

    JE comprends à peu près bien la méthode, mais là où cela coince c'est lors de l'insertion des infos dans la tables des clefs.
    Brouard insère le nom de la table grâce à la variable @NOM_TABLE et le champ qui contient la clef primaire grâce à @NOM_CHAMP.

    Ce que je ne comprends pas c'est :
    1) Ou est déclarée la variable @NOM_CHAMP (peut être n'est-ce pas utile?)
    2) Comment la procédure stockée fait elle pour déterminer quel champ de MaTable contient la clef primaire et donc l'importer ???

    ex : Deux tables
    MaTable1 avec
    MaTable1_ID numeric(5) NOT NULL
    MaTable1_LIB varchar(30) NULL

    MaTable2
    MaTable_ID numeric(5) NOT NULL
    MaTable2_LIB varchar(30) NULL

    @NOM_CHAMP doit récupérer MaTable1_ID et MaTable2_ID mais comment cela se passe ???

    Si vous pouviez m'éclairer cela m'aiderai beaucoup.

    Bonne journée à tous

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

Discussions similaires

  1. Récupérer la liste des identity et champs numeric
    Par FamiDoo dans le forum Développement
    Réponses: 2
    Dernier message: 26/04/2008, 19h49
  2. Convertir un champ BLOB en LONG RAW
    Par Friz dans le forum Oracle
    Réponses: 5
    Dernier message: 13/01/2006, 14h31
  3. Convertir un champ DATETIME en DATE avec SQLSERVER
    Par __fabrice dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/11/2005, 11h26
  4. Comment convertir un champs en string ?
    Par kalisto95 dans le forum ASP
    Réponses: 2
    Dernier message: 22/09/2005, 12h15
  5. [SQL] Convertir un champ INT en CHAR dans un SELECT ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/03/2005, 14h45

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