首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >添加新列时的复杂默认表达式

添加新列时的复杂默认表达式
EN

Stack Overflow用户
提问于 2022-03-16 13:00:51
回答 2查看 223关注 0票数 1

我想通过添加一个新列来修改现有的PostgreSQL (14)表。它不需要为NULL,所以我需要为现有列提供一个默认值。但是,此默认值取决于另一列,因此我希望使用复杂表达式(即IF-ELSE),如下所示:

代码语言:javascript
运行
复制
ALTER TABLE products
    ADD COLUMN IF NOT EXISTS description TEXT NOT NULL DEFAULT (
        IF products.id < 100 THEN
            'BLUE'
        ELSE
            'YELLOW'
        END IF
    )
;

我尝试了上面的代码,得到了以下有洞察力的错误消息:

错误:“产品”或“产品”附近的语法错误

我也试过这样做:

代码语言:javascript
运行
复制
ALTER TABLE products
    ADD COLUMN IF NOT EXISTS description TEXT NOT NULL DEFAULT (
        CASE
            WHEN products.id < 100 THEN 'BLUE'
            ELSE                        'YELLOW'
        END
    )
;

-- error: cannot use column reference in DEFAULT expression

有可能吗?如果是,那怎么做?如果不是,我应该使用一个虚拟默认值并在ALTER后面加上一个立即更新语句吗?

EN

回答 2

Stack Overflow用户

发布于 2022-03-16 13:36:36

不能引用DEFAULT子句中的其他列。此外,SQL不知道IF子句。

您必须使用BEFORE INSERT触发器:

代码语言:javascript
运行
复制
CREATE FUNCTION set_desc() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   NEW.description :=
      coalesce(
         NEW.description,
         CASE WHEN NEW.id < 100 THEN 'BLUE'
              ELSE 'YELLOW'
         END
      );
   RETURN NEW;
END;$$;

CREATE TRIGGER set_desc
   BEFORE INSERT ON products FOR EACH ROW
   EXECUTE PROCEDURE set_desc();
票数 1
EN

Stack Overflow用户

发布于 2022-03-16 15:24:36

生成列可以轻松地解决您的问题。你不需要更新。它会自动更新。唯一的问题是不能直接更新生成的列。您需要更新基列,在您的示例中,是id来更新生成的列。

代码语言:javascript
运行
复制
alter table products   
ADD COLUMN description text 
GENERATED ALWAYS AS (case when id < 100 then 'blue' else 'yellow' end ) STORED;

还可以管理列访问。

生成的列与其基础基列保持独立的访问权限。因此,可以对其进行排列,以便特定角色可以从生成的列中读取,而不能从基础基列中读取。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71497572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档