sql - 在数据已经不正确的 postgres 表中添加检查
问题描述
这对我来说似乎是一个有用的问题,并且在任何地方都没有找到任何关于它的书面信息,所以认为这可能太明显了。只是想确认一下:
如果我更改 postgres 表以添加检查,但已经存在的数据与此检查不一致,则不会发生任何事情,对吗?Postgres 只会检查添加检查后插入/更新的数据吗?
假设某行的出生年份列值为 1987。如果我添加一个检查作为出生年份 > 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();
但你真的应该再考虑一下。问问自己是否真的希望旧数据违反条件。只清理旧的和有问题的数据可能比保留它更好。您永远无法确定一行满足的条件。
推荐阅读
- php - 405 方法不允许 - PUT (PHP)
- java - @Refreshscope 与 DriverManagerDataSource
- python-3.x - 如何通过其中一列中的每个值将一列随机数添加到数据框中?
- node.js - 如何测试我的猫鼬预保存钩子中的 if 语句
- sql-server - 为什么执行存储过程会导致它被创建
- node.js - 如何配置释放切换服务器以在 Azure 应用服务中通过 HTTPS 工作?
- javascript - 获取 ESLint:不必要的转义字符
- java - Java - 定义几个自定义异常而不重写每个异常(干)
- java - @ManyToOne 没有在 Child 表中保留 Parent FKey 列
- javascript - 如何处理对客户端反应应用程序的外部重定向?