sql - 在 postgres 表中添加检查,其中数据已经不正确

标签 sql postgresql database-trigger check-constraints

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

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

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

最佳答案

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

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

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<>fiddle

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

关于sql - 在 postgres 表中添加检查,其中数据已经不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62418593/

相关文章:

ruby-on-rails - Ruby on Rails - 使用 md5 的 Postgresql - Rake 中止! fe_sendauth : no password supplied

python - 我可以使用触发器来添加外键组合吗?

ibm-midrange - AS400 物理文件记录上次更新时间戳

mysql - MySQL 中何时使用单引号、双引号和反引号

php - 从mysql查询中提取特定日期

mysql - 选择最小总值相同的随机列

java - PgBouncer 与 WildFly/Application Server 连接池的优势?

postgresql - Postgres 是列中的值

php - 更改 MySQL 数据库的字符集会导致 SELECT 问题吗?

插入一行后触发更新两列的操作时Mysql错误1442