sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで条件付きサブクエリを使用して一意のインデックスを作成するにはどうすればよいですか?

    ルールを使用することの欠点は、ルールが解析後にクエリを書き換えるだけなので、データがトリガーを介して追加された場合、データが起動しないことです。ロジックを使用して関数を呼び出すCHECK制約を追加する方が安全です。私があなたの論理に正しく従えば、それは次のようになるはずです:

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


    1. postgresqlで削除された行を取り戻しました

    2. PHP Mysqliは行を返しませんが、手動SQLクエリは結果を返します

    3. Oracle SQL:区切り文字列で行を並べ替える

    4. SQLで行を複製する最も簡単な方法