这对我来说似乎是一个有用的问题,但在任何地方都没有找到任何有关它的书面信息,因此认为这可能太明显了。只是想确认一下:
如果我更改 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();
但是你真的应该再考虑一下。问问自己是否真的希望旧数据违反条件。清理旧的和有错误的数据可能比保留它更好。否则,您永远无法确定行满足的条件。
关于sql - 在 postgres 表中添加检查,其中数据已经不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62418593/