根据查询结果设置默认值

时间:2019-08-14 07:28:43

标签: postgresql ddl

我有两个表:

  1. menu
      id     |     tag  
---------------------------    
      1      |      a
      2      |      a
      3      |      b
      4      |      b
  1. 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)

感谢您的帮助。

2 个答案:

答案 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();