【问题标题】:Add constraint to table with check in Postgres使用 Postgres 向表添加约束
【发布时间】:2021-05-19 08:20:08
【问题描述】:

我想通过将CONSTRAINT 添加到特定列以尊重某些正则表达式来ALTER 我现有的表。

我尝试通过执行来规范电话前缀号码:

ALTER TABLE users
    ADD CONSTRAINT users_prefix_constraint 
        CHECK (users.phone_prefix ~ '^\+\d{1,3}$');

而且它工作正常。

但我想更通用地使用它并定义包含正则表达式模式的DOMAIN,以便在不同的地方(即在触发器中)使用相同的模式。这就是为什么我想这样做:

CREATE DOMAIN ph_prefix AS TEXT CHECK (VALUE ~'^\+\d{1,3}$');

ADD CONSTRAINT users_prefix_constraint CHECK (users.phone_prefix :: ph_prefix);

这里的问题是,CHECK 部分期望某个函数返回 boolean,而强制转换没有。

  1. 有办法吗?
  2. 这是定义约束的好方法吗?也许这不是首选方式。

【问题讨论】:

    标签: database postgresql database-design constraints


    【解决方案1】:

    如果您有理由定义域但没有将其用作users.phone_prefix 列的数据类型,则创建此简单函数

    create or replace function ph_prefix_valid(s text) returns boolean as
    $$
    begin
     perform s::ph_prefix;
     return true;
    exception when others then
     return false;
    end;
    $$ language plpgsql;
    

    然后

    ADD CONSTRAINT users_prefix_constraint CHECK (ph_prefix_valid(users.phone_prefix));
    

    【讨论】:

      【解决方案2】:

      我认为你错过了域的意义。

      您不会将域添加为约束,但会将其用作列的数据类型:

      ALTER TABLE users ALTER phone_prefix TYPE ph_prefix;
      

      【讨论】:

      • 谢谢。我错过了最清晰的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多