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

Sam*_*ick 1 postgresql partitioning

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

Lau*_*lbe 5

PostgreSQL 将在行更改时检查约束,无论检查表达式中的值是否更改。

请参阅此示例

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
);
Run Code Online (Sandbox Code Playgroud)

第二个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;
Run Code Online (Sandbox Code Playgroud)

现在让我们看看约束何时被检查:

SELECT * FROM log;

 id | checked
----+---------
  1 |      42
  4 |     100
  5 |     100
Run Code Online (Sandbox Code Playgroud)