仅在插入时检查约束,而不在更新PostgresQL上检查约束

时间:2015-03-24 08:25:25

标签: postgresql insert unique-constraint check-constraints integrity

My Check约束如下:

ALTER TABLE tablename
ADD CONSTRAINT check_duplicate_rows 
CHECK (reject_duplicate_rows(columnB, columnC, columnD) < 2);

我希望仅在插入记录时才评估约束。

目前它对插入和更新语句都有效,问题是我的系统需要更新插入的行,而检查约束会阻止更新。

reject_duplicate_rows函数如下:

CREATE OR REPLACE FUNCTION reject_duplicate_rows(columnB integer, columnC integer, columnD integer)
  RETURNS integer AS
$BODY$

DECLARE
    results INTEGER := 1;
    v_count INTEGER := 0;

BEGIN
    IF columnC <> 23 THEN
       RETURN results;
    END IF;

    SELECT total INTO v_count FROM 
        (SELECT  columnB,
                 columnC,
                 columnD,
                 count(*) AS  total 
        FROM     table_name
        WHERE B = columnB AND C = columnC AND D = columnD
        GROUP BY 1, 2, 3)
        as temp_table;

    IF COALESCE(v_count, 0) = 0 THEN
        RETURN results;
    END IF; 

    IF v_count >= 1 THEN
        results := 2;
    END IF;
    RETURN results;
EXCEPTION
  WHEN OTHERS THEN
    RETURN results;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1000;
ALTER FUNCTION reject_duplicate_rows(integer, integer, integer)
  OWNER TO postgres

1 个答案:

答案 0 :(得分:0)

您是否尝试创建UPDATE触发器?见Creating postgresql trigger