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
"Software is like sex, it’s better when it’s free"
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.
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
Cdt,
Kabilou
- Edité par kabilou 27 juillet 2015 à 14:32:06
"Software is like sex, it’s better when it’s free"
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
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.