[Sql Server 2005]Contrainte d'unicité autorisant plusieurs NULL

Le
Oriane
Bonjour,

la question est dans le titreComment fairte puisque la contrainte Sql
n'autorise la présence que d'un seul NULL dans les données ?

Bon week-end !
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Rudi Bruchez
Le #11884671
Bonjour,

Oriane a écrit:

la question est dans le titre...Comment fairte puisque la contrainte Sql
n'autorise la présence que d'un seul NULL dans les données ?



En effet, c'est une limitation gênante de SQL Server, qui contredit la
norme SQL. Tu peux contourner la problème en faisant respecter la
contrainte par un trigger.

--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Fred BROUARD
Le #11884661
Rudi Bruchez a écrit :
Bonjour,

Oriane a écrit:

la question est dans le titre...Comment fairte puisque la contrainte Sql
n'autorise la présence que d'un seul NULL dans les données ?



En effet, c'est une limitation gênante de SQL Server, qui contredit la
norme SQL. Tu peux contourner la problème en faisant respecter la
contrainte par un trigger.



et surtout n'oubliez pas d'y ajouter un index !

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.sqlspot.com *************************
Oriane
Le #11884621
Merci à vous deux !
Oriane
Le #11884601
"Rudi Bruchez" news:%> En effet, c'est une limitation gênante de SQL Server, qui contredit
la
norme SQL. Tu peux contourner la problème en faisant respecter la
contrainte par un trigger.


Euh par le + grand des hasards, tu n'aurais pas son code ?
Rudi Bruchez
Le #11884581
Bonjour,


Oriane a écrit:
Euh par le + grand des hasards, tu n'aurais pas son code ?



qqch comme ceci :

USE tempdb
GO

CREATE TABLE dbo.doublon (
id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
col int NULL)
GO

CREATE INDEX nix$doublon$col ON dbo.doublon (col)
GO

CREATE TRIGGER atr$doublon$col_unique
ON dbo.doublon
AFTER INSERT, UPDATE
AS BEGIN
IF @@ROWCOUNT = 0 RETURN
SET NOCOUNT ON

IF EXISTS (
SELECT 1
FROM dbo.doublon d
JOIN inserted i ON d.id <> i.id AND d.col = i.col)
BEGIN
RAISERROR('doublons sur col interdits', 16, 10)
ROLLBACK
END
END
GO

INSERT INTO dbo.doublon (col) VALUES (NULL)
INSERT INTO dbo.doublon (col) VALUES (NULL)
INSERT INTO dbo.doublon (col) VALUES (1)
INSERT INTO dbo.doublon (col) VALUES (2)
INSERT INTO dbo.doublon (col) VALUES (3)
GO
SELECT * FROM dbo.doublon
GO

INSERT INTO dbo.doublon (col) VALUES (1)

--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Oriane
Le #11884541
Merci beaucoup !
Rudi Bruchez
Le #11884491
Bonjour, bonne année,

Oriane a écrit:
Merci beaucoup !



J'ai oublié de préciser une chose. La comparaison ne fonctionnera que si
la connexion a l'option ANSI_NULLS à ON. Par sécurité, ça peut valoir la
peine d'ajouter en début de trigger un test du genre :

IF SESSIONPROPERTY ('ANSI_NULLS') = 0
SET ANSI_NULLS ON

--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT, MVP SQL Server
http://www.babaluga.com/
http://rudi.developpez.com/
Publicité
Poster une réponse
Anonyme