Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

7 réponses
Avatar
Oriane
Bonjour,

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 ?

Bon week-end !

7 réponses

Avatar
Rudi Bruchez
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/
Avatar
Fred BROUARD
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 *************************
Avatar
Oriane
Merci à vous deux !
Avatar
Oriane
"Rudi Bruchez" <rudi#nospam#at#babaluga.com> a écrit dans le message de
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 ?
Avatar
Rudi Bruchez
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/
Avatar
Oriane
Merci beaucoup !
Avatar
Rudi Bruchez
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/