如何创建从每天1开始的序列

时间:2016-02-19 16:42:49

标签: sql postgresql plpgsql postgresql-9.1

序列应该返回值1,2,3等,每天从1开始。 current_date应该用于确定日期。

例如,今天第一次打电话,它会在第二次打2,等等。

明天,第一次打电话再次回来1,第二次打电话等等。

使用Postgres 9.1。

4 个答案:

答案 0 :(得分:0)

您只需要将cronjob视为在指定的时间或日期运行shell命令。

用于运行cron作业的Shell命令 psql --host host.domain.com --port 32098 --db_name databaseName< my.sql

然后你可以将它添加到你的crontab(我建议你使用crontab -e来避免破坏)

# It will run your command at 00:00 every day
# min hour wday month mday command-to-run
    0    0    *     *    * psql --host host.domain.com --port 32098 --db_name databaseName < my.sql

答案 1 :(得分:0)

这是一项非常有趣的任务。

让我们尝试使用额外的序列作为日期和替代函数来获得下一个值:

-- We will use anonymous block here because it is impossible to use
-- variables and functions in DDL directly 
do language plpgsql $$
begin
  execute 'create sequence my_seq_day start with ' || (current_date - '1900-01-01')::varchar;
end; $$;

-- Initialize sequence
select nextval('my_seq_day');

create sequence my_seq;

create or replace function nextval_daily(in p_seq varchar) returns bigint as $$
declare
  dd bigint;
  lv bigint;
begin
  select current_date - '1900-01-01'::date into dd;
  -- Here we should to retrieve current value from sequence
  -- properties instead of currval function to make it session-independent 
  execute 'select last_value from '||p_seq||'_day' into lv;
  if dd - lv > 0 then
    -- If next day has come
    -- Reset main sequens
    execute 'alter sequence '||p_seq||' restart';
    -- And set the day sequence to the current day
    execute 'alter sequence '||p_seq||'_day restart with '||dd::varchar;
    execute 'select nextval('''||p_seq||'_day'')' into lv;
  end if;
  return nextval(p_seq);
end; $$ language plpgsql;

然后使用函数nextval_daily代替nextval

希望它有用。

答案 2 :(得分:0)

使用表格保留序列:

create table daily_sequence (
    day date, s integer, primary key (day, s)
);

此函数将检索下一个值:

create or replace function daily_sequence()
returns int as $$
    insert into daily_sequence (day, s)
    select current_date, coalesce(max(s), 0) + 1
    from daily_sequence
    where day = current_date
    returning s
    ;
$$ language sql;

select daily_sequence();

如果出现不可能的duplicate key value错误,请准备好重试。如果不需要前几天的序列,请删除它们以使表和索引尽可能轻:

create or replace function daily_sequence()
returns int as $$
    with d as (
        delete from daily_sequence
        where day < current_date
    )
    insert into daily_sequence (day, s)
    select current_date, coalesce(max(s), 0) + 1
    from daily_sequence
    where day = current_date
    returning s
    ;
$$ language sql;

答案 3 :(得分:0)

我也遇到了几乎类似的要求。

处理查询的逻辑,而不是修改顺序。 使用 setval()将序列保留为 0 (如果该序列是当天的第一个条目)。 序列的其他 nextval()

下面是示例查询:

SELECT
CASE WHEN NOT EXISTS (
SELECT   primary_key   FROM    schema.table   WHERE   date(updated_datetime) = #{systemDate} limit 1)
THEN 
setval('scheam.job_seq', 1) 
ELSE 
nextval('scheam.job_seq') 
END
用户必须具有

UPDATE 权限才能执行setval。

GRANT UPDATE ON ALL SEQUENCES IN SCHEMA ur_schema TO user;