Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cle primaire null SQL Server

Cle primaire null SQL Server

Sujet résolu
    24 juillet 2015 à 15:18:51

    Bonjour, :)

    Je souhaite ajouter une clé primaire à un couple de clé primaire déjà existant. Ce qui fait que je me retrouve avec 3 clé primaires. 

    Jusqu'ici pas de soucis en théorie. Cependant le champ que je crée est pour le moment null (pas de valeur pas défaut). 

    Mais SQL Server est pas contant et n'hésite pas à me le dire :

    Cannot define PRIMARY KEY constraint on nullable column in table '******'

    Or d'après la règle n°3 de Codd c'est possible :

    "Traitement des valeurs nulles :

    Le système de gestion de bases de données doit permettre à chaque champ de demeurer nul (ou vide). Spécifiquement, il doit soutenir une représentation "d'information manquante et d'information inapplicable" qui est systématique, distincte de toutes les valeurs régulières (par exemple, "distincte de zéro ou tous autres nombres," dans le cas des valeurs numériques), et ce indépendamment du type de données. Cela implique également que de telles représentations doivent être gérées par le système de gestion de bases de données d'une manière systématique."


    Cela s'applique également au clé primaire, non?


    Est-il donc possible d'outrepasser cette règle de SQL Server? J'ai fais des recherche mais les avis diverges. J'ai des brides d'idées avec set ansi_nulls mais pas concluant pour le moment. Sachez que j'ai conscience de la dangerosité de mettre une clé null (mais elle reste unique puisque le couple avant était unique).

    J'ai également une solution avec clé unique au lieu de clé primaire (qui semble fonctionner), mais je ne peux pas garantir que le client accepte cette solution.


    J'aimerais donc l'avis et l'aide d'expert! :)


    Merci d'avance.
    Kabilou

    • Partager sur Facebook
    • Partager sur Twitter
    "Software is like sex, it’s better when it’s free"
      27 juillet 2015 à 9:16:36

      Bonjour,

      Petit up du lundi matin :)

      Kabilou

      • Partager sur Facebook
      • Partager sur Twitter
      "Software is like sex, it’s better when it’s free"
        27 juillet 2015 à 10:24:48

        Je ne suis pas un expert, loin de là :p

        Mais à mon avis, tu ne peux pas rendre une clé primaire nulle, car à ce moment là, si pour un tuple, la clé primaire est nulle, comment le reconnaitre parmi les autres, il n'aura plus d'identifiant unique.

        Selon le cours..., la définition de la clé primaire est la suivante :

        La clé primaire d'une table est une contrainte d'unicité, composée d'une ou plusieurs colonnes, et qui permet d'identifier de manière unique chaque ligne de la table.

        • Contrainte d'unicité : la clé doit être unique
        • Composée d'une ou plusieurs colonnes : Tu peux faire des clés composites
        • Permet d'identifier chaque ligne de manière unique : Une clé ne peut pas être à NULL.

        Comment définis-tu ta clé primaire dans ton script de relation de table ?

        Vu que tu as une clé composite, peut être qu'il pourrait éventuellement accepter qu'un membre de la clé primaire soit NULL, mais j'en doute.

        • Partager sur Facebook
        • Partager sur Twitter
          27 juillet 2015 à 14:31:38

          Bonjour et merci.

          De base il y a déjà un couple de valeur qui compose la clé primaire. Ce couple est unique (puisque clé primaire avant) donc le fait de rajouter un champ null ne change pas l'unicité.

          Voila le script actuel.

          IF EXISTS 
           (SELECT 1 FROM SYSOBJECTS  
           INNER JOIN SYSCOLUMNS ON SYSOBJECTS.ID = SYSCOLUMNS.ID  
           WHERE SYSOBJECTS.NAME = 'NOM_TABLE'  
           AND SYSCOLUMNS.NAME = 'NOM_COLUMN_ADD') 
          ALTER TABLE NOM_TABLE  DROP COLUMN NOM_COLUMN_ADD 
          GO 
          
          ALTER TABLE NOM_TABLE
          ADD NOM_COLUMN_ADD varchar(10) NULL
          
          GO
          
          ALTER TABLE NOM_TABLE 
          DROP CONSTRAINT NOM_PK
          GO
          
          
          ALTER TABLE NOM_TABLE
          ADD CONSTRAINT NOM_PK UNIQUE (CHAMP1, CHAMP2 ,NOM_COLUMN_ADD)
          GO


          Ceci est fonctionnel car j'utilise une clé unique, en gros j'aimerais savoir si la même chose avec une clé primaire est possible :D

          Cdt,

          Kabilou

          -
          Edité par kabilou 27 juillet 2015 à 14:32:06

          • Partager sur Facebook
          • Partager sur Twitter
          "Software is like sex, it’s better when it’s free"
            27 juillet 2015 à 17:42:32

            Bon le client à trancher, on créer le champ en not null et on met une valeur par défaut!

            Tout cela pour pas grand chose, j'aurai appris des trucs au moins. :D

            Je clos, bonne journée et merci encore pirkoa pour ta participation :)

            Kabilou

            -
            Edité par kabilou 27 juillet 2015 à 17:42:41

            • Partager sur Facebook
            • Partager sur Twitter
            "Software is like sex, it’s better when it’s free"
              27 juillet 2015 à 19:37:35

              kabilou a écrit:

              Je clos, bonne journée et merci encore pirkoa pour ta participation :)


              Pas de quoi, au plaisir ;)
              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2021 à 11:12:59

                Bonjour,

                En mon sens, la clé primaire est utilisé avec un hash en interne de la BDD afin de vérifier son unicité : comment calculer un hash d'une valeur null ?!

                Pour rappel Null n'est pas 0 mais rien ou une absence de valeur...

                Cdl

                • Partager sur Facebook
                • Partager sur Twitter

                Cle primaire null SQL Server

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown