PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erstelle ich einen eindeutigen Index mit Bedingung und Unterabfrage in PostgreSQL?

Der Nachteil bei der Verwendung von Regeln besteht darin, dass Regeln die Abfrage einfach umschreiben, nachdem sie analysiert wurde, sodass sie nicht ausgelöst werden, wenn die Daten über einen Trigger hinzugefügt werden. Es ist sicherer, eine CHECK-Einschränkung hinzuzufügen, die eine Funktion mit Ihrer Logik aufruft. Wenn ich Ihrer Logik richtig folge, sollte es so aussehen:

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));