IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Contrainte "d'exclusivité" sur plusieurs colonnes


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut Contrainte "d'exclusivité" sur plusieurs colonnes
    Bonjour,

    Sur une table donnée, je dois faire en sorte qu'une valeur n'existe qu'une seule fois par ligne.

    Est ce qu'il est possible d'arriver à ce résultat à l'aide d'une contrainte ?

    Merci pour votre aide,

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Oui en implémentant une contrainte d'unicité sur l'ensemble des colonnes concernées

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE dbo.table
    (
     ID INT NOT NULL,
     ID2 INT NOT NULL
     CONSTRAINT u_test_unique UNIQUE (ID,ID2)
    )
    ++

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je ne suis pas sûr que c'est ce que cherche b_lob.
    Si nous ajoutons une contrainte d'unicité, cela nous garantit que la même tuple ne sera stocké qu'une seule fois dans la table.

    En revanche si c'est une valeur doit être stockée par exemple dans une colonne parmi 4 et que les autres doivent être à NULL, on peut le vérifier à l'aide d'une contrainte de domaine.

    Suppons que nous avons des exclusivités mais que celles-ci ne sont valables que pour un trimestre de l'année.
    Nous aurions une table dont la spécification de la structure serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE TbExclusivite
    (
    	IDExclusivite INT NOT NULL IDENTITY CONSTRAINT PK_TbExclusivite PRIMARY KEY,
    	nomExclusivite VARCHAR(20) NOT NULL CONSTRAINT UQ_TbExclusivite_nomExclusivite UNIQUE,
    	estPremierTrimestre BIT NOT NULL,
    	estSecondTrimestre BIT NOT NULL,
    	estTroisiemeTrimestre BIT NOT NULL,
    	estQuatriemeTrimestre BIT NOT NULL,
    )
    Et pour vérifier que l'exclusivité n'est appliquée que pour un et un seul trimestre de l'année, nous ajouterions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ALTER TABLE dbo.TbExclusivite
    ADD CONSTRAINT CHK_TbExclusivite_estPremierTrimestre_estSecondTrimestre_estTroisiemeTrimestre_estQuatriemeTrimestre
    	CHECK
    	(
    		(
    			estPremierTrimestre = 1
    			AND estSecondTrimestre = 0
    			AND estTroisiemeTrimestre = 0
    			AND estQuatriemeTrimestre = 0
    		)
    		OR
    		(
    			estPremierTrimestre = 0
    			AND estSecondTrimestre = 1
    			AND estTroisiemeTrimestre = 0
    			AND estQuatriemeTrimestre = 0
    		)
    		OR
    		(
    			estPremierTrimestre = 0
    			AND estSecondTrimestre = 0
    			AND estTroisiemeTrimestre = 1
    			AND estQuatriemeTrimestre = 0
    		)
    		OR
    		(
    			estPremierTrimestre = 0
    			AND estSecondTrimestre = 0
    			AND estTroisiemeTrimestre = 0
    			AND estQuatriemeTrimestre = 1
    		)
    	)
    @++

  4. #4
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    Merci pour la pertinence de vos réponses !

    Il est en effet plus approprié pour moi d'utiliser la solution proposée par elsuket.

    Certaines des combinaisons de valeurs notamment nulle ne devant pas exister
    et du fait qu'il est possible d'avoir plusieurs fois les mêmes valeurs dans le même ordre. (les mêmes lignes)


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. NHibernate contrainte unicité sur plusieurs colonnes
    Par Papy214 dans le forum NHibernate
    Réponses: 2
    Dernier message: 22/10/2009, 14h36
  2. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27
  3. Lister sur plusieurs colonnes dans état
    Par armagued dans le forum Access
    Réponses: 3
    Dernier message: 30/10/2005, 21h21
  4. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo