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 :

[SQL Server] INSERT avec clef sur n° auto


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut [SQL Server] INSERT avec clef sur n° auto
    Bonjour,

    voici ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Create table [TBL_COMPETENCE]
    (
    	[PK_COMP] Integer NOT NULL, UNIQUE ([PK_COMP]),
    	[VCH_COMP] Varchar(64) NOT NULL, UNIQUE ([VCH_COMP])
    ) 
    go
    PK_COMP est une valeur auto incrémentée à partir de la valeur trouvé dans la table suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Create table [TBL_CLEF]
    (
    	[VCH_CLEF] Varchar(64) NOT NULL, UNIQUE ([VCH_CLEF]),
    	[NUM_CLEF] Integer Default 0 NOT NULL,
    	[PK_CLEF] Integer NOT NULL, UNIQUE ([PK_CLEF])
    ) 
    go

    Ainsi, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    insert into TBL_COMPETENCE(VCH_COMP)
    	values('un test')
    insert into TBL_COMPETENCE(VCH_COMP)
    	values('un autre test')
    insert into TBL_COMPETENCE(VCH_COMP)
    	values('un dernier test')
    go
     
    select * from TBL_COMPETENCE
    go
    Je voudrai qu'il mette en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PK_COMP	VCH_COMP
    =======	===============
    1	un test
    2	un autre test
    3	un dernier test
    Mais je dois bien avouer que je n'ai pas idée de comment faire, puisque quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into TBL_COMPETENCE(VCH_COMP)
    	values('un test')
    j'ai droit à un beau
    Serveur : Msg 515, Niveau 16, État 2, Ligne 1
    Impossible d'insérer la valeur NULL dans la colonne 'PK_COMP', table 'DB_IDICOM.dbo.TBL_COMPETENCE'. Cette colonne n'accepte pas les valeurs NULL. INSERT a échoué.
    L'instruction a été arrêtée.
    Si quelqu'un pouvait m'indiquer la voie à suivre s'il-vous-plait...

  2. #2
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    quel SGBD ?

  3. #3
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    j'utilise MSDE (moteur SQL serveur 2000), là.

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    auto incrémenté par quel mecanisme ??
    Car dans ta declaration de table, tu ne définies que des champs "normaux".

    La technique que tu utilises est bonne pour gérer les acces concurrentiels (un topic dessus a été fait avec la participation de SQLPro).
    Cependant, tel que tu nous devoiles tes tables, ca risque d'etre a toi de faire ta recherche de clé et ton incrémentation.
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  5. #5
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    J'ai plusieurs question :

    - Comment est incrémenté la valeur de TBL_COMPETENCE (via un trigger) ? Car je ne crois pas que cela se fasse tout seul.
    - Sinon il faut faire un Insert de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into TBL_COMPETENCE(PK_COMP, VCH_COMP) 
      (1,'un test') etc ...
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into TBL_COMPETENCE(PK_COMP, VCH_COMP) 
      select ...  from TBL_CLEF
    Je ne suis pas sur d'avoir tout compris

  6. #6
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    Le mécanisme que je souhaite mettre en place est le suivant :

    Quand on fait une insertion dans TBL_COMPETENCE, le trigger va chercher la dernière valeur de clef entrée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select TBL_CLEF.NUM_CLEF
    from TBL_CLEF
    where VCH_CLEF='PK_COMPETENCE'
    pour la donner à PK_COMPETENC, puis va mettre à jour cette valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update TBL_CLEF
    set TBL_CLEF.NUM_CLEF = TBL_CLEF.NUM_CLEF +1
    where VCH_CLEF='PK_COMPETENCE'
    .

    (le tout dans une unique transaction pour éviter les problèmes d'accès concurentiels).

  7. #7
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce que tu veux faire est totalement incompatible avec la notion de clé primaire.
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  8. #8
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    une clef primaire, ça doit bien être non null et unique, non ? En quoi c'est incompatible ? Je pensais qu'au contraire, une valeur autoincrémentée était l'idéal pour une clef primaire.

    Je n'ai rien inventé, la méthode est mentionnée ici : http://sql.developpez.com/clefs/

    Le problème est surtout que je ne dois pas savoir la réaliser.

  9. #9
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Monstros Velu
    une clef primaire, ça doit bien être non null et unique, non ?
    Oui, mais comme te l'indique ton message d'erreur, elle doit être renseignée lors de l'INSERT et non pas via un UPDATE.

    Donc il te faudrait construire une procédure pour ton INSERT qui :
    - Update TBL_CLEF (+1),
    - Lit cette valeur de PK,
    - Réalise ton INSERT

    Pour toute question sur le langage procédural, on sort du cadre du SQL, donc si tu le souhaites, je peux déplacer ton message dans le forum forum MS SQL-Server ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  10. #10
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    donc j'essayais de faire quelque chose d'impossible :o) Ca se fera donc dans un procédure.

    Merci ;o)

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

Discussions similaires

  1. insertion avec contrainte sur clef primaire ?
    Par panthere noire dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 20/02/2012, 14h52
  2. Réponses: 4
    Dernier message: 21/04/2010, 09h45
  3. [SQL SERVER 2K8] Droit lecture sur Vue avec Fonction
    Par 33Romain dans le forum Administration
    Réponses: 1
    Dernier message: 27/08/2009, 09h34
  4. [TRIGGER] insertion avec clef auto-increment dupliquer
    Par TheBlackReverand dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 27/03/2009, 12h06
  5. auto increment avec sql server comme avec mysql
    Par skystef dans le forum Accès aux données
    Réponses: 6
    Dernier message: 21/09/2007, 08h22

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