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 :

clé auto incrémentée


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 17
    Points
    17
    Par défaut clé auto incrémentée
    Bonjour,

    Je développe sous Delphi 7 avec les composants dbExpress pour accèder à une base de données SQL Server.
    J'ai créé une table où j'ai paramétré avec le SQL Server Management la clé primaire en tant que Compteur et Identité avec comme paramètre :
    début compteur = 1
    Incrément Compteur = 1

    Je pensais que cette manipulation servait à ce que ce champ soit en clé auto incrémentée. Mais lorsque je fais le bout de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE ON';
    SQLDataSetRequete_.ExecSQL(true);
    clientDataSetMATABLE.AppendRecord([10 000,champ2]);
    clientDataSetMATABLE.ApplyUpdates(-1);
    SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE OFF';
    SQLDataSetRequete_.ExecSQL(true);
    le nouvel enregistrement a 10 000 comme valeur de clé primaire. Je pensais que lors de l'envoi de cette valeur, elle était ensuite recalculée par SQL SERVER et réaffectée à la valeur max de la clé primaire +1, par exemple 296 si la dernière valeur était 295.

    Mon souci est que j'avais créé une fonction qui, au lieu de mettre 10 000, récupérait la valeur Max de cette clé par requête, comme ci dessous. J'ai une quizaine de logiciels qui lancent ce code en même temps et je n'ai pas de retours comme quoi il y aurait des erreurs sauf que tous les enregistrements ne sont pas créés et je me demande si cette manière de gérer les clés ne pouvait pas provoquer des conflits de clés...

    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
     
    SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE ON';
    SQLDataSetRequete_.ExecSQL(true);
    clientDataSetMATABLE.AppendRecord([ObtenirDernierID(MATABLE),champ2]);
    clientDataSetMATABLE.ApplyUpdates(-1);
    SQLDataSetRequete_.CommandText:='SET IDENTITY_INSERT MATABLE OFF';
    SQLDataSetRequete_.ExecSQL(true);
     
     
    function ObtenirDernierID(table: string): LongWord;
    begin
       SQLDataSetObtenirID.Close;
       ClientDataSetObtenirID.Close;
       SQLDataSetObtenirID.CommandType := ctQuery;
       SQLDataSetObtenirID.CommandText := 'SELECT MAX(ID'+Table+') MaValeur FROM '+Table;
       ClientDataSetObtenirID.Open;
       ObtenirDernierID:=ClientDataSetObtenirID.Fieldbyname('MaValeur').AsInteger;
    end;
    Quelqu'un peut il me dire déjà si mon code est correct ou si je gère mal les clé auto incrémentées et ensuite s'il y a une aute méthode pour les gérer?

    Merci d'avance

  2. #2
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    C'est normal puisque vous utilisez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET IDENTITY_INSERT MATABLE ON
    qui permet de spécifier la valeur de la colonne d'identité.
    Par défaut celui-ci est à OFF, donc ne le spécifiez pas

    @++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Ma réponse va sans doute vous paraître idiote mais si je ne mets pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET IDENTITY_INSERT MATABLE ON
    et que je ne mets rien dans le premier champ, celui de la clé comme ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    clientDataSetMATABLE.AppendRecord([nil,champ2]);
    clientDataSetMATABLE.ApplyUpdates(-1);
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    clientDataSetMATABLE.AppendRecord([Null,champ2]);
    clientDataSetMATABLE.ApplyUpdates(-1);
    j'ai un message d'erreur :

    Field Value Required.

    ce serait donc mon appendrecord que je ne fais pas bien ou alors je dois utiliser autre chose? Ce code fonctionnait très bien sur Interbase et sous MySQL mais c'est depuis que j'ai migré sous SQL Server...

  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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Lorsque vous spécifiez SET IDENTITY_INSERT MATABLE ON, vous pouvez insérer la valeur que vous souhaitez dans la colonne qui a la propriété de compteur.

    Donc si vous voulez faire un INSERT en laissant à SQL Server le soin de calculer la valeur de ce compteur pour une nouvelle insertion, insérez directement les valeurs des autres colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TABLE TEST
    (
    	ID INT NOT NULL IDENTITY CONSTRAINT PK_TEST PRIMARY KEY,
    	nomTest VARCHAR(50) NOT NULL,
    	dateTest DATETIME NOT NULL
    )
    GO
     
    INSERT INTO dbo.TEST (nomTest, dateTest) VALUES ('NouveauTest', '17/03/2009 00:00:00.000')
     
    -- On peut aussi écrire :
    INSERT INTO dbo.TEST VALUES ('NouveauTest', '17/03/2009 00:00:00.000')
    Pour récupérer la valeur du compteur pour la ligne que vous venez d"insérer, utilisez la fonction SCOPE_IDENTITY().

    @++

Discussions similaires

  1. Pb d'auto incrémentation sous interbase !!!
    Par le.clown dans le forum InterBase
    Réponses: 2
    Dernier message: 26/02/2004, 14h11
  2. prbl auto-incrémente
    Par cb dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/11/2003, 11h32
  3. Dernière clé auto incrémenté ?
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 15/11/2003, 10h41
  4. [CODE] auto incrémentation ?
    Par Roi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/09/2003, 15h09
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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