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

PostgreSQL Discussion :

Problème sur une fonction pour vérifier l'intégrité d'une table


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut Problème sur une fonction pour vérifier l'intégrité d'une table
    Bonjour à tous,

    Je souhaiterais rajouter un "check" sur une de mes tables afin qu'une colonne booléenne ("IsLocalHouse") ne puisse posséder qu'une seule valeur à true.
    J'ai donc créé une fonction avec le code pgsql suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE
    	nb_answers BigInt;
    BEGIN
    	SELECT COUNT(*) INTO nb_answers FROM "DATA_STATIC_COUNTERPARTY" WHERE "IsLocalHouse" = true;
    	IF nb_answers = 1 THEN
    		RETURN true;
    	ELSE
    		RETURN false;
    	END IF;
    END
    Puis je rajoute le check pour que la valeur de cette fonction soit égale à true.
    Quand j'ajoute la contrainte, aucun problème: s'il n'y a qu'un seul true, le check se rajoute. S'il y en a plusieurs, une erreur est levée me disant que la condition n'est pas vérifiée.
    Jusqu'ici tout va bien.

    Par contre, une fois que j'ai rajouté l'exception, je peux mettre à true une seconde et une troisieme valeur de la colonne, et aucune erreur n'est levée. Et quand j'essaye de remettre à false une de ces valeurs (et même pour repasser de 2 valeurs true à une seule), une erreur est levée et m'empêche de modifier la valeur.
    Une idée d'où peut venir ce problème très étrange?

    Merci!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Ce genre de contrainte qui implique toutes les lignes de la table ne peut pas se programmer avec un CHECK.
    A la place, il faut utiliser un index unique partiel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX uidx on la_table (la_colonne_bool) WHERE la_colonne_bool is true;

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    Parfait, exactement ce dont j'avais besoin!
    Merci!

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

Discussions similaires

  1. Une fonction pour vérifier si une saisie est une date
    Par MasterMbg dans le forum Codes sources à télécharger
    Réponses: 10
    Dernier message: 02/10/2013, 11h18
  2. Réponses: 4
    Dernier message: 08/03/2013, 11h04
  3. Trouver les paramètres d'une fonction pour la faire tendre vers une valeur
    Par cedrix57 dans le forum Intelligence artificielle
    Réponses: 4
    Dernier message: 24/05/2011, 10h38
  4. Réponses: 3
    Dernier message: 15/11/2010, 18h22
  5. Réponses: 14
    Dernier message: 01/05/2007, 19h25

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