OVH Cloud OVH Cloud

Garantir l'unicité des valeurs avec "allow null"

2 réponses
Avatar
Laurent
Bonjour à tous,

J'ai actuellement un petit soucis. Dans une de mes tables, j'ai un champs
de type varchar dont la valeur est optionnelle (donc null permis).
Or lorsque la valeur est spécifiée elle ne peut pas être dupliquée. La
création d'un index unique ne fonctionne pas car il n'accepte alors le null
qu'une seule fois pour l'ensemble des enregistrements.

Y a-t'il une façon élégante de résoudre ce problème ?
La solution de coder manuellement la vérification avant la sauvegarde étant
évidemment possible.

Merci d'avance.

2 réponses

Avatar
Fred BROUARD
Bonjour,

Laurent a écrit:
Bonjour à tous,

J'ai actuellement un petit soucis. Dans une de mes tables, j'ai un champs
de type varchar dont la valeur est optionnelle (donc null permis).
Or lorsque la valeur est spécifiée elle ne peut pas être dupliquée. La
création d'un index unique ne fonctionne pas car il n'accepte alors le null
qu'une seule fois pour l'ensemble des enregistrements.

Y a-t'il une façon élégante de résoudre ce problème ?



Oui, un trigger. Exemple :

CREATE TABLE MaTable (COL_UNIQUE_OR_NULL INT)
GO

CREATE TRIGGER G_Matable_UNIQUE_OR_NULL
ON MaTable
FOR INSERT, UPDATE
AS
IF EXISTS (SELECT COUNT(COL_UNIQUE_OR_NULL)
FROM MaTable
GROUP BY COL_UNIQUE_OR_NULL
HAVING COUNT(COL_UNIQUE_OR_NULL) > 1)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Violation de la contrainte d''unicité de la colonne
COL_UNIQUE_OR_NULL de la table MaTable', 16, 1)
END
GO

INSERT INTO MaTable VALUES (NULL)
INSERT INTO MaTable VALUES (NULL)
INSERT INTO MaTable VALUES (NULL)
INSERT INTO MaTable VALUES (1)
INSERT INTO MaTable VALUES (2)
INSERT INTO MaTable VALUES (3)

SELECT * FROM MaTable

COL_UNIQUE_OR_NULL
------------------
NULL
NULL
NULL
1
2
3

INSERT INTO MaTable VALUES (1)

Serveur : Msg 50000, Niveau 16, État 1, Procédure G_Matable_UNIQUE_OR_NULL,
Ligne 13
Violation de la contrainte d'unicité de la colonne COL_UNIQUE_OR_NULL de la
table MaTable

La solution de coder manuellement la vérification avant la sauvegarde étant
évidemment possible.

Merci d'avance.





A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Laurent
Merci beaucoup pour le temps passé à me répondre. Je vais expérimenter de
suite.

"Fred BROUARD" a écrit dans le message de news:

Bonjour,

Laurent a écrit:
Bonjour à tous,

J'ai actuellement un petit soucis. Dans une de mes tables, j'ai un
champs de type varchar dont la valeur est optionnelle (donc null permis).
Or lorsque la valeur est spécifiée elle ne peut pas être dupliquée. La
création d'un index unique ne fonctionne pas car il n'accepte alors le
null qu'une seule fois pour l'ensemble des enregistrements.

Y a-t'il une façon élégante de résoudre ce problème ?



Oui, un trigger. Exemple :

CREATE TABLE MaTable (COL_UNIQUE_OR_NULL INT)
GO

CREATE TRIGGER G_Matable_UNIQUE_OR_NULL
ON MaTable
FOR INSERT, UPDATE
AS
IF EXISTS (SELECT COUNT(COL_UNIQUE_OR_NULL)
FROM MaTable
GROUP BY COL_UNIQUE_OR_NULL
HAVING COUNT(COL_UNIQUE_OR_NULL) > 1)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Violation de la contrainte d''unicité de la colonne
COL_UNIQUE_OR_NULL de la table MaTable', 16, 1)
END
GO

INSERT INTO MaTable VALUES (NULL)
INSERT INTO MaTable VALUES (NULL)
INSERT INTO MaTable VALUES (NULL)
INSERT INTO MaTable VALUES (1)
INSERT INTO MaTable VALUES (2)
INSERT INTO MaTable VALUES (3)

SELECT * FROM MaTable

COL_UNIQUE_OR_NULL
------------------
NULL
NULL
NULL
1
2
3

INSERT INTO MaTable VALUES (1)

Serveur : Msg 50000, Niveau 16, État 1, Procédure
G_Matable_UNIQUE_OR_NULL, Ligne 13
Violation de la contrainte d'unicité de la colonne COL_UNIQUE_OR_NULL de
la table MaTable

La solution de coder manuellement la vérification avant la sauvegarde
étant évidemment possible.

Merci d'avance.





A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************