根据查询结果设置默认值

Set default value from a query result

我有两个 table:

  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 table 创建一个类别列,它在菜单 table 中具有相同的值,因此它可以如下所示。

      id     |   menu_id   |     tag
------------------------------------------  
      1      |      3      |      b
      2      |      2      |      a
      3      |      1      |      a

我只想在将新列添加到 table free_menu 时为它设置一个默认值,但以下操作不起作用:

ALTER TABLE free_menu
ADD category VARCHAR(10) NOT NULL
DEFAULT (SELECT category FROM menu WHERE id = menu_id)

感谢您的帮助。

您必须将修改分为三个步骤:

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;

您可以将这些转换包含在一个事务中,以对您的模式进行原子修改。

指定默认值时不能使用子查询。所以我认为你应该在添加新记录时触发用户自动更新类别列中的值

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