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 :

[MSDE][INSERT Auto]Valeur négative de PK


Sujet :

MS SQL Server

  1. #1
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut [MSDE][INSERT Auto]Valeur négative de PK
    Dans une même table je dois stocker deux types de lignes en fonction de la provenance des données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE [dbo].[Table1] (
    	[Identificateur] [int] NOT NULL ,
    	[Nom] [varchar] (50) COLLATE French_CI_AS NOT NULL ,
    	[Fonction] [varchar] (50) COLLATE French_CI_AS NOT NULL 
    ) ON [PRIMARY]
    GO
    J'ai pensé les différencier par leur PK : Identificateur.
    celle ci est un int.
    J'ai donc réservé pour un type les int positifs et pour l'autre les int négatifs.
    La PK est auto incrémentée sur le INSERT.

    Je ne trouve pas comment faire pour faire un INSERT soit en positif, soit en négatif dans la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE PROCEDURE [dbo].[Insert Essai] 
    (
    	@Name varchar(50),
    	@Fonction varchar(50),
    	@DonneeLocale bit 
    )
    AS
     
    INSERT Table1(Nom, Fonction) ?????
    VALUES (@Name, @Fonction)
     
    GO
    Pour ce qui est du DELETE j'ai pas ce problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE PROCEDURE [dbo].[Delete Essai] 
    (
    	@DonneeLocale bit 
    )
    AS
     
    DELETE FROM Table1
    WHERE (Identificateur>=0 AND @DonneeLocale=1) OR (Identificateur<0 AND @DonneeLocale=0)
    GO
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Partant duprincipe que votre type est le DonneeLocale

    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
    CREATE PROCEDURE [dbo].[Insert Essai]
    (
       @Name varchar(50),
       @Fonction varchar(50),
       @DonneeLocale bit
    )
    AS
    BEGIN
    declare @m int
     
    if @DonneeLocale = 0
       select @m=min(Identificateur)-1 from Table1
    else
       select @m=max(Identificateur)+1 from Table1
     
    INSERT Table1(Identificateur, Nom, Fonction)
    VALUES (@m, @Name, @Fonction)
     
    return @m
    END
    GO
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    Merci pour ta réponse.

    Mais si je me rappelle bien de fonctionnement de l'AUTO-INCREMENT et que je le compare à cette solution que tu propose, cette dernière n'optimise pas la gestion de la PK.
    Faire MAX+1 ou MIN-1, est-ce que ça permet de combler les trous dus à un DELETE sur certaines valeurs ?

    Si par exemple MIN = - 2 147 483 648, mais que seules les valeurs -1 et - 2 147 483 648 existent pour la colonne, on ne pourra plus inserer de ligne alors qu'en réalité il n'y a que 2 lignes ???

    Remarque :
    1 - en plus il ne faut pas oublier la gestion circulaire de la valeur sur la valeur - 2 147 483 648.
    2 - Si ma clé est auto incrémenté, lors du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT Table1(Identificateur, Nom, Fonction) 
    VALUES (@m, @Name, @Fonction)
    est-ce que SQL Server ne remontera pas erreur, car tu cherches à donner une valeur à un clé AUTO.
    C'est au pied du mur, qu'on voit le mieux le mur !!!

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/11/2006, 15h45
  2. Réponses: 4
    Dernier message: 23/09/2005, 14h15
  3. [JDBC]Probleme d'insertion des valeurs !!
    Par tarik75 dans le forum JDBC
    Réponses: 6
    Dernier message: 27/07/2005, 12h41
  4. INSERT avec valeur connue et résultat d'un SELECT...
    Par snoop dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 27/04/2005, 08h54
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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