2010-08-09 1 views
0

J'ai une table qui stocke un mélange de catégorie pour les clients. Le nombre de catégories peut changer, mais la répartition doit toujours être inférieure ou égale à 100% pour chaque client.Vérifiez la contrainte - toutes les lignes dans une table, pour chaque client <= 100% (PostgreSQL)

custom  type_  pct 
------- ------- ----- 
Cust1  Type A .33 
Cust1  Type B .17 
Cust1  Type C .50 
Cust2  Type A .30 
Cust2  Type D .10 
Cust2  Type E .10 
Cust2  Type F .50 

Des idées sur la façon dont je peux ajouter une contrainte de vérification pour appliquer cette règle?
Voici mon départ ...

ALTER TABLE cust_mix ADD CONSTRAINT ttl_pct_mix CHECK (SUM (pct) <= 1); 

Mais vérifie toutes les lignes, quel que soit l'ID client

Répondre

2

Vous ne serez pas en mesure d'atteindre cet objectif en ajoutant simplement une contrainte. Vous aurez besoin d'un déclencheur après insertion/mise à jour pour vérifier cela du côté de la base de données.

+0

Merci, je ne pensais pas que je pouvais le faire, mais je devais voir s'il était possible. – Vic

0

Je ne sais pas si c'est possible dans PostgreSQL car j'utilise uniquement SQL Server, mais vous n'avez pas besoin de faire un contrôle sur un identifiant client spécifique afin de vérifier votre contrainte. Vous pouvez simplement vérifier que la somme maximale est valide. Cela pourrait aider à le mettre dans votre contrainte.

Par exemple:

(
    SELECT TOP 1 
     SUM(pct) 
    FROM 
     cust_mix 
    GROUP BY 
     custom 
    ORDER BY 
     SUM(pct) DESC 
) <= 1 
+0

TOP est quelque chose de SQL Server, PostgreSQL utilise LIMIT: http://www.postgresql.org/docs/current/static/sql-select.html –

Questions connexes