【发布时间】:2021-07-02 19:51:53
【问题描述】:
使用 postgresql 开发 Rails 应用程序。
我正在尝试使用 case 语句来实现 pg 约束。
ALTER TABLE geolocation_postcodes
ADD CONSTRAINT canadian_format CHECK (
CASE WHEN country_code = 'CA' AND code !~ '\A^[A-Z]\d[A-Z]\s\d[A-Z]\d\Z' THEN FALSE
END
);
当尝试插入一个实例(应该通过)时,它每次都会被约束停止:
输入:
Geolocation::Postcode.insert(code: "G6V 4C9", country_code: "CA", created_at: Time.now, updated_at: Time.now)
结果:
ActiveRecord::StatementInvalid: PG::CheckViolation: ERROR: new row for relation "geolocation_postcodes" violates check constraint "canadian_format" DETAIL: Failing row contains (46, G6V 4C9, t, 2021-04-07 01:37:34.005891, 2021-04-07 01:37:34.005896, CA).
【问题讨论】:
-
您真正希望对国家/地区代码进行过滤的逻辑是什么?
-
邮政编码将来自不同的国家,它们有不同的格式,因此有不同的限制。因此,如果国家/地区是加拿大(国家代码的“CA”值),则根据 canadian_format 约束检查格式。所以基本上,如果 country_code 是“CA”,则检查代码(IE. G5V 4C9)以查看它是否与正则表达式匹配。如果失败,记录会反弹。
-
我已经在下面给出了答案。基本上,您的检查约束应该说明积极接受的案例是什么。你甚至不需要
CASE表达式。
标签: sql ruby-on-rails ruby postgresql