Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在postgres中自动创建多个记录?_Postgresql - Fatal编程技术网

Postgresql 在postgres中自动创建多个记录?

Postgresql 在postgres中自动创建多个记录?,postgresql,Postgresql,postgres是否有办法自动生成具有设置参数的子记录?我基本上是在尝试创建一个员工时间表,每次为给定日期创建一个新时间表时,我都会创建一个7个子记录,该周的每一天都有一个记录供用户填写 大概是这样的: date (automatically generated on a weekly basis) | hours | timesheet_id(FK) | project_id(FK) 2019-01-01 8

postgres是否有办法自动生成具有设置参数的子记录?我基本上是在尝试创建一个员工时间表,每次为给定日期创建一个新时间表时,我都会创建一个7个子记录,该周的每一天都有一个记录供用户填写 大概是这样的:

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; 
$$ ;