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 :

Ajout d'une clé primaire avec des doublons


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 2
    Par défaut Ajout d'une clé primaire avec des doublons
    Bonjour à tous,

    Voilà mon problème.
    Je dois récupérer une table DM_CONSULTATION_PLAINTE (SQL Server Express).
    Cette table représente en fait les plaintes enregistrées par un ostéo lors des consultations.
    Voici les principaux champs : NoConsultation, Description, CodePlainte, Rang.

    Pour l'instant, il n'y a pas de clé primaire et je tiens à en rajouter une.
    Le problème est qu'il y a des doublons avec le même NoConsultation et le même Rang.
    Le rang sert en fait à différencier les différentes plaintes d'une même consultation.

    Je veux donc rajouter un champ clé primaire à cette table afin que chaque ligne soient identifiée. Cette clé doit donc avoir un numéro incrémenté de 1 pour chaque ligne de la table.

    Je ne vois pas comment je peux faire.
    Si quelqu'un a une solution !
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 117
    Par défaut
    Tu peux ajouter un champ supplémentaire à ta table (et dans ta clef primaire) avec la propriété IDENTITY.

    mais si ton problème c'est effectivement des doublons, pourquoi ne pas "simplement" dédoublonner. Si tu n'as actuellement pas de contrainte sur ta table, le dédoublonnage devrait être relativement facile à appliquer.

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 2
    Par défaut Réponse
    Tu me dis qu'il faut que je dédoublonne mais je ne vois pas du tout commnent je peux faire ça.
    Peux-tu m'en dire un peu plus ?
    Merci d'avance.

  4. #4
    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
    Bonjour,

    Le problème est qu'il y a des doublons avec le même NoConsultation et le même Rang.
    Tu me dis qu'il faut que je dédoublonne mais je ne vois pas du tout commnent je peux faire ça.
    Cela signifie donc qu'un identifiant naturel serait le couple {NoConsultation, Rang}.
    Vous devez donc trouver dans les autres colonnes de votre table sur quel critère vous allez pouvoir discriminer les lignes à éliminer de façon à ne plus avoir de doublon.
    Ensuite vous devrez effectivement ajouter une colonne de type INT avec la propriété de compteur auto-incrémenté comme vous l'a conseillé tetsu no tama :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE dbo.DM_CONSULTATION_PLAINTE
    ADD maColonne_PK INT NOT NULL IDENTITY
    CONSTRAINT PK_DM_CONSULTATION_PLAINTE PRIMARY KEY
    Et vous devrez ensuite ajouter une contrainte d'unicité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE dbo.DM_CONSULTATION_PLAINTE
    ADD CONSTRAINT UQ_DM_CONSULTATION_PLAINTE_NoConsultation_Rang
    UNIQUE (NoConsultation, Rang)
    @++

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 117
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    alter table DM_CONSULTATION_PLAINTE
       add _ID int not null IDENTITY(1,1)
     
    delete 
    from 
    DM_CONSULTATION_PLAINTE T1
    join DM_CONSULTATION_PLAINTE T2 on T1.NoConsultation=T2.NoConsultation and T1.Rang=T2.Rang and T1.ID<>T2.ID
     
    alter table DM_CONSULTATION_PLAINTE
        drop _ID
     
    -- Si tes champs sont bien en NOT NULL
    alter table DM_CONSULTATION_PLAINTE
        ADD PRIMARY KEY (NoConsultation, Rang)
    J'ai pas testé mon code, j'ai pas sql server sous la main, mais ça devrait faire l'affaire à quelques défauts de syntaxe pret...

  6. #6
    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
    Cela fonctionnera effectivement, mais le prédicat de la jointure du DELETE élimine les deux lignes, si tant est que le couple de valeurs soit en double seulement ...

    @++

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 117
    Par défaut
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    alter table DM_CONSULTATION_PLAINTE
       add _ID int not null IDENTITY(1,1)
     
    create table FINAL
    (
    /* meme structure que ta table à dédoublonner en oubliant pas les NOT NULL sur les futur champs de la clef et la primary key*/
    )
     
    create table TMP
    (
    _ID int,
    NoConsultation Type,
    Rang Type
    )
     
    Insert Into TMP
    select 
    0 as [_ID],
    T1.NoConsultation,
    T1.Rang,
    from DM_CONSULTATION_PLAINTE T1
    group by T1.NoConsultation, T1.Rang
     
    -- va updater plusieurs fois la même ligne avec les ID des différents doublons
    Update TMP
    Set TMP._ID=DM_CONSULTATION_PLAINTE._ID
    From TMP join DM_CONSULTATION_PLAINTE on (TMP.NoConsultation=DM_CONSULTATION_PLAINTE.NoConsultation  and TMP.Rang=DM_CONSULTATION_PLAINTE.Rang )
     
    Insert into FINAL
    select
    --Mes champs de DM_CONSULTATION_PLAINTE
    from DM_CONSULTATION_PLAINTE where _ID in
    (select _ID from TMP)
     
    drop table DM_CONSULTATION_PLAINTE
     
    exec sp_rename 'FINAL', 'DM_CONSULTATION_PLAINTE'
     
    sp_recompile DM_CONSULTATION_PLAINTE

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    Bonjour,

    Voici une vidéo dans laquelle j'explique la méthode que j'utilise pour dédoublonner une table (A partir de la version 2005):

    http://www.screencast.com/t/mSa4ln0dwi

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

Discussions similaires

  1. Ajout d'une colonne obligatoire sur des doublons
    Par bernidupont dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/12/2013, 14h21
  2. Réponses: 5
    Dernier message: 12/03/2007, 10h21
  3. [JTable] Créer une JTable vide avec des noms de colonnes.
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 27/09/2005, 15h54
  4. insertion d'une clé primaire avec un "d" apostroph
    Par imer5 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 18/05/2005, 14h51
  5. [DTS] Import de données avec des doublons
    Par Hotchotte dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/03/2005, 14h19

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