PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créer un index unique avec conditionnel et sous-requête dans PostgreSQL ?

L'inconvénient de l'utilisation d'une règle est que les règles réécrivent simplement la requête après son analyse, donc si les données sont ajoutées via un déclencheur, elles ne se déclencheront pas. Il est plus sûr d'ajouter une contrainte CHECK qui appelle une fonction avec votre logique. Si je suis correctement votre logique, cela devrait ressembler à :

CREATE OR REPLACE FUNCTION check_user_client(fkc int) 
  RETURNS boolean AS
$$
DECLARE
  i int;
BEGIN
  SELECT count(*) INTO i FROM legal_entity WHERE fk_client = fkc;
  IF (i > 0) THEN
    RETURN true;
  END IF;

  SELECT count(*) INTO i FROM user_client WHERE fk_client = fkc;
  IF (i = 0) THEN
    RETURN true;
  END IF;

  RETURN false;  
END
$$ LANGUAGE plpgsql;

ALTER TABLE user_client ADD CONSTRAINT unique_user CHECK (check_user_client(fk_client));