Postgres会对我没有更新的列强制执行检查约束吗?

时间:2016-10-28 15:38:08

标签: postgresql partitioning

当我更新具有检查约束的列时,显然postgres必须检查它是否仍然符合约束。但是如果我更新行中的其他一些值并保持所有列的检查约束不变,它还会对这些值进行一些测试吗?我试图弄清楚在我不会修改的列上对额外检查约束有多大的性能影响,这样我就可以在分区表上排除约束条件以获得更多实用性。我的表有一系列维度列,每个维度列(或者至少其中许多列)都有检查约束,我知道这些约束基于分区约束。我从不在批处理作业之后将数据插入此表,但我对没有约束的数据列进行了一系列更新。

1 个答案:

答案 0 :(得分:2)

每当行更改时,PostgreSQL都会检查约束,无论检查表达式中的值是否发生更改。

请参阅this example

CREATE TABLE log (
    id SERIAL PRIMARY KEY,
    checked integer NOT NULL
);

CREATE OR REPLACE FUNCTION checker(i integer) RETURNS boolean
    LANGUAGE plpgsql VOLATILE AS
$$BEGIN
    INSERT INTO log (checked) VALUES (i);
    RETURN i > 0;
END;$$;

CREATE TABLE checkme (
    id integer PRIMARY KEY,
    checked integer NOT NULL
        CHECK (checker(checked)),
    unchecked integer NOT NULL
);

第二个UPDATE仅更改了unchecked列:

INSERT INTO checkme (id, checked, unchecked)
    VALUES (1, 42, 45);

UPDATE checkme
    SET checked = 100
    WHERE id = 1;

UPDATE checkme
    SET unchecked = 100
    WHERE id = 1;

现在让我们看看检查约束的时间:

SELECT * FROM log;

 id | checked
----+---------
  1 |      42
  4 |     100
  5 |     100