我想通过添加一个新列来修改现有的PostgreSQL (14)表。它不需要为NULL,所以我需要为现有列提供一个默认值。但是,此默认值取决于另一列,因此我希望使用复杂表达式(即IF-ELSE),如下所示:
ALTER TABLE products
ADD COLUMN IF NOT EXISTS description TEXT NOT NULL DEFAULT (
IF products.id < 100 THEN
'BLUE'
ELSE
'YELLOW'
END IF
)
;
我尝试了上面的代码,得到了以下有洞察力的错误消息:
错误:“产品”或“产品”附近的语法错误
我也试过这样做:
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后面加上一个立即更新语句吗?
发布于 2022-03-16 13:36:36
不能引用DEFAULT
子句中的其他列。此外,SQL不知道IF
子句。
您必须使用BEFORE INSERT
触发器:
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();
发布于 2022-03-16 15:24:36
生成列可以轻松地解决您的问题。你不需要更新。它会自动更新。唯一的问题是不能直接更新生成的列。您需要更新基列,在您的示例中,是id来更新生成的列。
alter table products
ADD COLUMN description text
GENERATED ALWAYS AS (case when id < 100 then 'blue' else 'yellow' end ) STORED;
还可以管理列访问。
生成的列与其基础基列保持独立的访问权限。因此,可以对其进行排列,以便特定角色可以从生成的列中读取,而不能从基础基列中读取。
https://stackoverflow.com/questions/71497572
复制相似问题