Postgresql 在postgres中自动创建多个记录?
postgres是否有办法自动生成具有设置参数的子记录?我基本上是在尝试创建一个员工时间表,每次为给定日期创建一个新时间表时,我都会创建一个7个子记录,该周的每一天都有一个记录供用户填写 大概是这样的:Postgresql 在postgres中自动创建多个记录?,postgresql,Postgresql,postgres是否有办法自动生成具有设置参数的子记录?我基本上是在尝试创建一个员工时间表,每次为给定日期创建一个新时间表时,我都会创建一个7个子记录,该周的每一天都有一个记录供用户填写 大概是这样的: date (automatically generated on a weekly basis) | hours | timesheet_id(FK) | project_id(FK) 2019-01-01 8
date (automatically generated on a weekly basis) | hours | timesheet_id(FK) | project_id(FK)
2019-01-01 8 1 2
2019-01-02 10 1 2
2019-01-03 8 1 2
2019-01-04 8 1 2
2019-01-05 0 1 2
2019-01-06 0 1 2
2019-01-07 9 1 2
正如评论中提到的,这是一个使用触发器的教科书案例 您需要一个处理创建新记录的过程。这可能会奏效:
create or replace function create_timesheet_days()
returns trigger as $BODY$
declare counter INTEGER := 0;
begin
while counter < 6 loop
insert into my_schema.timesheet_week
(timesheet_date, hrs, timesheet_id, project_id)
select
NEW.timesheet_date + counter as timesheet_date,
0 as hrs,
NEW.timesheet_id as timesheet_id,
project.project_id as project_id
from my_schema.project;
counter := counter + 1;
end loop;
return NEW;
END;
$BODY$
language 'plpgsql';
@Z4层是正确的,但触发器函数不需要循环,因为它可以简化为单个insert语句
create or replace function create_timesheet_days()
returns trigger
language 'plpgsql'
as $$
begin
insert into timesheet_days(timesheet_id, week_day)
select new.timesheet_id, wk_day
from generate_series (new.timesheet_date, new.timesheet_date+interval '6 day', interval '1 day') wk_day;
return new;
end;
$$ ;
你可以用触发器来做,如果你对它进行分析,它看起来会很危险。我相信它的效率更高,但在某种程度上,它肯定仍然是循环的,那么效率提高了多少?@Z4 tier。我没有特别介绍这一点。进一步的处理只有6行,我相信收益不大。然而,SQL是一种基于集合的语言,处理单行的循环结构通常被称为慢处理,这是Oracle的Tom Kyte创造的,请参见AskTom.com。通常,从循环结构转换为设置处理增益至少一个数量级,通常是几个数量级。浏览SO上的答案,看看有多少人建议放弃单语句循环。
create or replace function create_timesheet_days()
returns trigger
language 'plpgsql'
as $$
begin
insert into timesheet_days(timesheet_id, week_day)
select new.timesheet_id, wk_day
from generate_series (new.timesheet_date, new.timesheet_date+interval '6 day', interval '1 day') wk_day;
return new;
end;
$$ ;