我有两个表:
menu
id | tag
---------------------------
1 | a
2 | a
3 | b
4 | b
free_menu
id | menu_id
---------------------------
1 | 3
2 | 2
3 | 1
我想为free_menu表创建一个类别列,该表在菜单表中具有相同的值,因此如下所示。
id | menu_id | tag
------------------------------------------
1 | 3 | b
2 | 2 | a
3 | 1 | a
我只想在将新列添加到表free_menu
中时为其设置默认值,但是以下操作不起作用:
ALTER TABLE free_menu
ADD category VARCHAR(10) NOT NULL
DEFAULT (SELECT category FROM menu WHERE id = menu_id)
感谢您的帮助。
答案 0 :(得分:2)
您必须将修改分为三个步骤:
ALTER TABLE free_menu ADD category VARCHAR(10) NULL;
UPDATE free_menu f SET category = m.category FROM menu m WHERE m.id = f.menu_id;
ALTER TABLE free_menu ALTER category SET NOT NULL;
您可以将这些转换包含在一个事务中,以对架构进行原子修改。
答案 1 :(得分:0)
在指定默认值时不能使用子查询。因此,我认为您应该在添加新记录时用户触发类别列中的值自动更新
Create or replace function update_cat()
returns trigger
as $$ begin
if new.category is null then
new.category = (select tag from menu where id = new.menu_id);
end if;
return new;
end;
$$ language plpgsql;
CREATE TRIGGER
update_category
BEFORE INSERT ON
free_menu
FOR EACH ROW EXECUTE PROCEDURE
update_cat();