首页 > 解决方案 > 在数据已经不正确的 postgres 表中添加检查

问题描述

这对我来说似乎是一个有用的问题,并且在任何地方都没有找到任何关于它的书面信息,所以认为这可能太明显了。只是想确认一下:

如果我更改 postgres 表以添加检查,但已经存在的数据与此检查不一致,则不会发生任何事情,对吗?Postgres 只会检查添加检查后插入/更新的数据吗?

假设某行的出生年份列值为 1987。如果我添加一个检查作为出生年份 > 1990 并且我不更新此字段但我更新此行中的其他字段怎么办。我可以更新这一行吗?如果没有,那么有没有办法以某种方式添加检查,以便我能够在没有检查的情况下更新所有旧行但新添加的行会受到影响,基本上只添加对插入查询而不是更新查询的检查? 希望我的问题很清楚。

标签: sqlpostgresqldatabase-triggercheck-constraints

解决方案


检查约束确实检查表中已有的值,如果存在违反条件的行,则无法创建。这就是一个约束点,断言数据满足条件。

为了防止新数据违反条件,您可以做的是创建一个触发器来检查它并在违反时抛出错误。类似于以下内容:

CREATE FUNCTION check_birthyear
                ()
                RETURNS TRIGGER
AS
$$
BEGIN
  IF NOT new.birthyear > 1990 THEN
    RAISE EXCEPTION 'birthyear must be greater than 1990';
  END IF;

  RETURN new;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER elbat_check_birthyear
               BEFORE INSERT
               ON elbat
               FOR EACH ROW
               EXECUTE PROCEDURE check_birthyear();

db<>小提琴

但你真的应该再考虑一下。问问自己是否真的希望旧数据违反条件。只清理旧的和有问题的数据可能比保留它更好。您永远无法确定一行满足的条件。


推荐阅读