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

MS SQL Server Discussion :

clé primaire de type identity


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut clé primaire de type identity
    Bonjour,
    j'ai sur une table un clé primaire étant numéric identity (l'équivalent d'une sequence oracle).
    J'aurais deux questions à vous poser :
    - Est-il possible de récupérer le numéro identity créé par SQL Server lors d'une requête INSERT INTO MA_TABLE VALUES (...) via la méthode executeUpdate du package java.sql.PreparedStatement ?
    - Ensuite, est-il possible de désactiver l'incrémentation d'une identity lors d'une erreur survenue lors d'un INSERT ? Je m'explique :

    A un instant x, mon identity vaut 10
    J'insère un élément, mon identity est incrémenté et vaut 11
    J'exécute un INSERT mais dont un champ est trop long ou constraint violation Foreign Key ... : mon identity est incrémenté alors que rien n'a été inséré dans ma table. Est-il possible de ne pas incrémenter cet identity lors d'une erreur d'INSERT ?

    Merci pour vos réponses

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    1) dernier auto incrément
    Le dernier auto incrément effectué dans la session est obtenu par la variable globale @@IDENTITY.
    Pour le lire :
    Le dernier auto incrément effectué dans la session et dans l'étendue de code est obtenu par la fonction SCOPE_IDENTITY()
    Pour le lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SCOPE_IDENTITY() AS N
    C'est notamment utile si l'insertion à générer une autre insertion dans un trigger...

    Le dernier auto incrément effectué sur une table précise et quelque soit la session et l'étendue de code est obtenu par la fonction IDENT_CURRENT('nom_table')

    2) trous d'auto incrément
    Il est normal que vous ayez des trous si au moment de l'insertion une contrainte est violée. En effet il faut d'abord vérifier la contrainte de clef primaire, ce qui suppose la génération de la valeur de la clef auto incrémentée.
    Vous pouvez parfaitement récupérer ces trous, mais cela est inutile et extrêmement dangereux...
    Inutile car s'agissant de n° attribuer avec un hasard ordonné il n'y a pas d'intérêt que Pierre, Paul ou Jacques hérite de tel n° ou tel autre, pas plus qu'il n'y a d'intérêt que l'on gère la continuité.
    Dangereux car pour effectuer cette manœuvre il vous faut piloter une transaction au plus haut niveau d'isolation (SERIALIZABLE) ce qui verrouille de manière exclusive toute la table et provoque une forte contention de nature à générer des verrous mortels. Bref si vous voulez des performances catastrophiques, c'est ce qu'il faut faire...
    Exemple :

    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
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
     
    BEGIN TRANSACTION
     
    INSERT INTO MA_TABLE VALUES (...) 
    IF @@ERROR <> 0 GOTO LBL_ERROR
     
    GOTO LBL_RESUME
     
    LBL_ERROR:
     
    DECLARE @LASTID INT
    SET @LASTID  = @@IDENTITY
    DECLARE @SQL VARCHAR(512)
    SET @SQL = 'DBCC CHECKIDENT (''matable'', RESEED), ' + CAST(@LASTID - 1 AS VARCHAR(32)) + ')'
    EXEC (@SQL)
     
    ROLLBACK TRANSACTION
     
    LBL_RESUME
     
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    Plus généralement lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/clefs/

    A +

  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 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Au passage : utiliser du NUMERIC sur un identity est contre performant, utilisez du INT (OS 32 bits) ou du BIGINT (OS 64 bits).

    A +

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Merci pour ces éclaircissements

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

Discussions similaires

  1. Update d'une Clé Primaire de type NuméroAuto
    Par Goblins dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2008, 11h42
  2. Clé primaire de type GUID et type date
    Par Lucas Panny dans le forum SQL
    Réponses: 52
    Dernier message: 10/06/2008, 13h29
  3. récupérer un champ type Identity en C
    Par zamorakis dans le forum C
    Réponses: 3
    Dernier message: 29/02/2008, 11h03
  4. [MySQL] Utiliser une clé primaire de type string?
    Par Elrubio dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 02/08/2007, 10h20
  5. [SQL Server] Modifier un ID de type Identity
    Par BoOom dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/04/2006, 09h37

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