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

Langage SQL Discussion :

Savoir si un enregistrement existe déjà dans une table?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 88
    Par défaut Savoir si un enregistrement existe déjà dans une table?
    Bonjour,

    Je debute en SQL et j'aurai cette question:
    Comment savoir si un enregistrement existe déjà dans une table?

    Afin que de cette façon, si je m'apprète a enregistrer de nouvelles valeurs identique, je puisse modifier la fin de ces nouvelles valeurs.

    Merci d'avance

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    que veux tu faire exactement?
    donne un exemple

  3. #3
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Tu dois faire un trigger

  4. #4
    Membre expérimenté
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Par défaut
    Vas faire un tour du côté de
    IF EXISTS

  5. #5
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Si vous êtes sous Oracle, il y l'instruction MERGE qui semble correspondre à votre besoin : http://download-west.oracle.com/docs...htm#SQLRF01606

    Use the MERGE statement to select rows from one or more sources for update or insertion into one or more tables. You can specify conditions to determine whether to update or insert into the target tables.

    This statement is a convenient way to combine multiple operations. It lets you avoid multiple INSERT, UPDATE, and DELETE DML statements.

    MERGE is a deterministic statement. That is, you cannot update the same row of the target table multiple times in the same MERGE statement.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 88
    Par défaut
    Merci

    En fait, j'ai une table qui contient des User.
    Mais il se peut que j'ai a rentréer une autre personne dont le nom ets identique.

    Et donc j'aimerai faire en sorte de détecter si il existe deja dans la table, de faire en sorte que le suivant se voit incrémenté.
    Genre:
    nomuser ==> existe deja
    nomuser0 ==> le nouveau user du meme nom que nomuser se voit attribuer à chiffre.

    En fait je sais que je pourais faire ça avec un select:

    Select * from matableuser where user="nomuser";

    Si resultat non nul je peux ajouter mon new user, sinon je l'incremente.

    J'ai juste???

  7. #7
    Membre expérimenté
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Par défaut
    Essaies ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF EXISTS (Select * from matableuser where user="nomuser")
    BEGIN
     
    END

  8. #8
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    Salut,

    tu peux en effet le afire avec un select.

    Mais il faut faire attention:
    nomuser ==> existe deja
    nomuser0 ==> le nouveau user du meme nom que nomuser se voit attribuer à chiffre.
    si tu as déja le nomuser deux fois il faudra faire attention au nouveau nom qui deviendra nomuser1 s'il ya 3 fois cette personne.

    il faut peut être voir l nombre d'enregistrements qui correspondent à la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select * from matableuser where user like 'nomuser%';
    Sinon pourquoi veux tu des noms de users différents?

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Je reformule ton problème et te donne la solution :

    J'ai une table qui contient des utilisateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE T_UTILISATEUR_USR
    (USR_ID    INTEGER NOT NULL PRIMARY KEY IDENTITY,
     USR_NOM   CHAR(16) NOT NULL UNIQUE)
    Mais il se peut que j'ai a rentréer une autre personne dont le nom est identique.
    Si c'est le cas, je voudrais àjouter au nom un chiffre auto incrémenté.

    Exemple, la table contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T_UTILISATEUR_USR VALUES (1, 'DUPONT')
    INSERT INTO T_UTILISATEUR_USR VALUES (2, 'DURAND')
    INSERT INTO T_UTILISATEUR_USR VALUES (3, 'DURAND1')
    Je tente de rentrer DUPOND, il doit insérer DUPOND
    Je tente de rentrer DUPONT, il doit insérer DUPONT1
    Je tente de rentrer DURAND, il doit insérer DURAND2

    Comment faire cela en une seule requête ?
    *** LA SOLUTION ***

    1) créer une table des nombres de 1 à n par exemple de 1 à 999 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE T_NUM
    (NUM INT NOT NULL PRIMARY KEY)
    -- insertion des nombres de 0 à 9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO T_NUM VALUES (0)
    INSERT INTO T_NUM VALUES (1)
    INSERT INTO T_NUM VALUES (2)
    INSERT INTO T_NUM VALUES (3)
    INSERT INTO T_NUM VALUES (4)
    INSERT INTO T_NUM VALUES (5)
    INSERT INTO T_NUM VALUES (6)
    INSERT INTO T_NUM VALUES (7)
    INSERT INTO T_NUM VALUES (8)
    INSERT INTO T_NUM VALUES (9)
    -- insertion des nombres de 10 à 999
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO T_NUM
    SELECT DISTINCT T1.NUM + 10 * T2.NUM + 100 * T3.NUM
    FROM   T_NUM T1
           CROSS JOIN T_NUM T2
           CROSS JOIN T_NUM T3
    WHERE  T1.NUM + 10 * T2.NUM + 100 * T3.NUM BETWEEN 10 AND 999
    2) l'unique requête d'insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO T_UTILISATEUR_USR
    SELECT NOM + CASE NUM
                    WHEN 0 THEN ''
                    ELSE CAST(NUM AS VARCHAR(3))
                 END
    FROM (SELECT MIN(NOM) AS NOM, MIN(NUM) AS NUM
          FROM   (SELECT '<LeNom>' AS NOM, NUM
                  FROM   T_NUM) T
          WHERE   NOM + CASE NUM
                           WHEN 0 THEN ''
                           ELSE CAST(NUM AS VARCHAR(3))
                        END NOT IN (SELECT USR_NOM 
                                    FROM   T_UTILISATEUR_USR)) TT
    Exemples :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    -- insertion de DUPOND
    INSERT INTO T_UTILISATEUR_USR
    SELECT NOM + CASE NUM
                    WHEN 0 THEN ''
                    ELSE CAST(NUM AS VARCHAR(3))
                 END
    FROM (SELECT MIN(NOM) AS NOM, MIN(NUM) AS NUM
          FROM   (SELECT 'DUPOND' AS NOM, NUM
                  FROM   T_NUM) T
          WHERE   NOM + CASE NUM
                           WHEN 0 THEN ''
                           ELSE CAST(NUM AS VARCHAR(3))
                        END NOT IN (SELECT USR_NOM 
                                    FROM   T_UTILISATEUR_USR)) TT
     
    -- vérification :
    SELECT * FROM T_UTILISATEUR_USR
     
    USR_ID      USR_NOM          
    ----------- ---------------- 
    9           DUPOND          
    6           DUPONT          
    7           DURAND          
    8           DURAND1  
     
    -- insertion de DURAND
    INSERT INTO T_UTILISATEUR_USR
    SELECT NOM + CASE NUM
                    WHEN 0 THEN ''
                    ELSE CAST(NUM AS VARCHAR(3))
                 END
    FROM (SELECT MIN(NOM) AS NOM, MIN(NUM) AS NUM
          FROM   (SELECT 'DURAND' AS NOM, NUM
                  FROM   T_NUM) T
          WHERE   NOM + CASE NUM
                           WHEN 0 THEN ''
                           ELSE CAST(NUM AS VARCHAR(3))
                        END NOT IN (SELECT USR_NOM 
                                    FROM   T_UTILISATEUR_USR)) TT
     
    -- vérification :
    SELECT * FROM T_UTILISATEUR_USR
     
    USR_ID      USR_NOM          
    ----------- ---------------- 
    9           DUPOND          
    6           DUPONT          
    7           DURAND          
    8           DURAND1         
    10          DURAND2  
     
     
    -- insertion de DURAND1
    INSERT INTO T_UTILISATEUR_USR
    SELECT NOM + CASE NUM
                    WHEN 0 THEN ''
                    ELSE CAST(NUM AS VARCHAR(3))
                 END
    FROM (SELECT MIN(NOM) AS NOM, MIN(NUM) AS NUM
          FROM   (SELECT 'DURAND1' AS NOM, NUM
                  FROM   T_NUM) T
          WHERE   NOM + CASE NUM
                           WHEN 0 THEN ''
                           ELSE CAST(NUM AS VARCHAR(3))
                        END NOT IN (SELECT USR_NOM 
                                    FROM   T_UTILISATEUR_USR)) TT
     
    -- vérification :
    SELECT * FROM T_UTILISATEUR_USR
     
    USR_ID      USR_NOM          
    ----------- ---------------- 
    9           DUPOND          
    6           DUPONT          
    7           DURAND          
    8           DURAND1         
    11          DURAND11        
    10          DURAND2
    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/ * * * * *

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/07/2006, 16h42
  2. Existence colonne dans une table
    Par exe dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 11/07/2006, 09h01
  3. Réponses: 5
    Dernier message: 16/06/2006, 11h19
  4. Réponses: 3
    Dernier message: 22/04/2006, 06h05
  5. Enregistre résulat multiplication dans une table
    Par faranfasi dans le forum Access
    Réponses: 2
    Dernier message: 11/10/2005, 13h04

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