根据查询结果设置默认值
Set default value from a query result
我有两个 table:
menu
id | tag
---------------------------
1 | a
2 | a
3 | b
4 | b
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();
我有两个 table:
menu
id | tag
---------------------------
1 | a
2 | a
3 | b
4 | b
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();