PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como criar um índice exclusivo com condicional e subconsulta no PostgreSQL?


A desvantagem de usar uma regra é que as regras simplesmente reescrevem a consulta depois que ela é analisada, portanto, se os dados forem adicionados por meio de um gatilho, ele não será acionado. É mais seguro adicionar uma restrição CHECK que chama uma função com sua lógica. Se eu seguir sua lógica corretamente, deve ser algo como:
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));