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 - imposer un identifiant


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de liliprog
    Inscrit en
    Juillet 2004
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 135
    Points : 61
    Points
    61
    Par défaut [SQL Server] Insert - imposer un identifiant
    Bonjour à tous,

    J'aimerais savoir si c'est possible d'inseré un nouvel élément en lui imposant un identifiant.

    En fait dans ma table, j'ai plusieurs champs avec des identifiants. Certains champs ont été supprimés donc il y a des trous au niveau des identifiants. Genre j'ai une liste d'identifiant qui fait: 11-12-13-......-19 donc entre 13 et 19 j'ai un vide. Je veux donc inséré mon nouveau champs par exemple avec l'identifiant 14. Comment je fait?

    J'ai essayé en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into matable values ('monnom','monprenom','identifiant')
    Mais j'ai une erreur
    An explicit value for the identity column in table 'matable' can only be specified when a column list is used and IDENTITY-INSERT is on
    Merci pour vos lumières.

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    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 : 38
    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
    Points : 10 765
    Points
    10 765
    Par défaut
    Tu fais une procédure stockée qui recherche les identifiants libres.

    Pour 15 éléments ca va, pour 200 000, ca peut être coûteux.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    C'est une chose A NE JAMAIS FAIRE que de vouloir récupérer les trous !!!
    Un identifiant consommé doit être considéré comme définitivement perdu.

    Vous risquez des ennuis sans nom à cause de problématiques tel le paradoxe temporel !

    En effet que se passera t-il si vous avez réaffecté la clef 14 à un nouveau client et que l'un des utilisateur vient vous voir en vous disant qu'hier il a effacer par erreur le client 14...

    A +

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    L'ordre SQL suivant te permet de trouver premier chrono de llibre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select min(id) + 1 from ma_table a where not exists (select 1 from ma_table b where a.id +1 = b.id)

  5. #5
    Membre du Club Avatar de liliprog
    Inscrit en
    Juillet 2004
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    Je sais qu'elles sont mes identifiants libre.

    C'est une chose A NE JAMAIS FAIRE que de vouloir récupérer les trous !!!
    Un identifiant consommé doit être considéré comme définitivement perdu.
    Je comprend bien mais c'est juste une appli qui tourne en local donc ça ne devrai pas posé de probleme.

    Quelle est donc la requete que je dois faire pour forcer l'utilisation d'un identifiant sachant que ma tableest formé de la façon suivante:
    matable:
    column1 : monnom: varchar(50)
    column2 : nomprenom: varchar (50)
    column3 : monidentifiant: int

    d'habitude pour inserer un nouveau champs je fais juste
    insert into matable values ('dupont','jean') et donc l'identifiant est créer automatiquement (s'auto-incremente)

    Mais avec mon histoire d'imposer l'identifiant, le fait d'ecrir:
    insert into matable values ('dupont','jean',14) ne fonctionne pas!!

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    Cela devrait te convenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into ma_table values (select 'dupont' , 'jean' , min(id) + 1 from ma_table a where not exists (select 1 from ma_table b where a.id +1 = b.id))

  7. #7
    Membre du Club Avatar de liliprog
    Inscrit en
    Juillet 2004
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Mystro
    Cela devrait te convenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into ma_table values (select 'dupont' , 'jean' , min(id) + 1 from ma_table a where not exists (select 1 from ma_table b where a.id +1 = b.id))
    J'ai bien noté que ton code permet d'obtenir le premier identifiant disponible mais le code que tu me donne ne fonctionne pas non plus. ça reviens au même que la requete que j'essaye de faire.

    Pour vérifié quand meme je l'ai testé et je confirme donc que ça ne fonctionne pas.

    Il faut peut etre que je change quelque chose dans le paramtrage de ma table?

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Citation Envoyé par liliprog
    J'ai bien noté que ton code permet d'obtenir le premier identifiant disponible mais le code que tu me donne ne fonctionne pas non plus.
    - Quelle est l'erreur renvoyée ?
    - Quel est le SGBD utilisé ?

    Pour ce que j'en sais, on ne peut "forcer" la valeur d'un champ Auto-Increment : une telle déclaration signifie que tu laisses le SGBD se charger de l'attribution des valeurs, point.

    Citation Envoyé par liliprog
    Citation Envoyé par SQLPro
    C'est une chose A NE JAMAIS FAIRE que de vouloir récupérer les trous !!!
    Un identifiant consommé doit être considéré comme définitivement perdu.
    Je comprend bien mais c'est juste une appli qui tourne en local donc ça ne devrai pas posé de probleme.
    La question est "pourquoi veux-tu faire une chose pareille ?" Si SQLPro est aussi péremptoire, c'est qu'une clé n'est pas une information "significative" côté client, mais juste un moyen pour le SGBD d'identifier l'information. Et le SGBD se moque bien de savoir s'il y a des trous on non ...

  9. #9
    Membre du Club Avatar de liliprog
    Inscrit en
    Juillet 2004
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    j'utilise sql server comme SGBD.
    L'erreur est la meme que celle que j'ai signalé au depart.

    J'ai trouvé une autre solution pour mon probleme donc je n'ai pas besoin de forcer un identifiant. Merci à tous pour vos conseils.
    Bilan:
    Eviter de toucher au identifiant, laissé le SGBD s'en charger, il y a toujours une autre solution à son probleme.

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Ceci est propre à MS SQL Server et Sybase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET IDENTITY_INSERT MaTable ON
     
    INSERT INTO MATABLE (monnom, monprenom, monidentifiant) 
    VALUES ('monnom', 'monprenom', 528) 
     
    SET IDENTITY_INSERT MaTable OFF
    Lisez l'article que j'ai écrit sur ce sujet :
    http://sqlpro.developpez.com/cours/clefs/#L4

    A +

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/11/2006, 11h37
  2. [SQL Server] insertion de champs depuis un requete
    Par bleuerouge dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/06/2006, 19h19
  3. [SQL Server] INSERT avec clef sur n° auto
    Par Monstros Velu dans le forum Langage SQL
    Réponses: 9
    Dernier message: 31/03/2006, 18h54
  4. Réponses: 9
    Dernier message: 17/03/2005, 10h20
  5. [C#][SQL Server] Insertion de données inversées
    Par lamiae18 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 20/04/2004, 17h11

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