生成唯一的ID以将记录追加到PostgreSQL中

时间:2019-01-25 10:53:07

标签: sql database postgresql

我正在使用一个postgreSql查询,该查询用一些值填充一张表,并且在我运行时采用不同的参数。我每次使用不同的参数运行查询时都在追加行,现在,我有兴趣向所有作为一组参数输出的行提供一个自动生成的ID。这样我就可以访问属于某些参数。

有人可以帮助我如何每次使用一个唯一的ID列追加行吗?

3 个答案:

答案 0 :(得分:0)

您可以使用RETURNING语句获取返回ID

INSERT INTO Table1 (...) VALUES (...)
RETURNING idCol;

语法

RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

答案 1 :(得分:0)

您可以使用串行(对于bigint,则使用bigserial)作为列类型。

它们实际上是包装器,它们是自动将其默认值配置为临时nextval()的整数和biginteger类型的>序列,它也会在后台为您创建。

要添加这样的字段,您只需要执行以下这样的句子:

alter table your_table add column id serial primary key;

(将表名和列名调整为所需的名称)。

  

很显然,如果您尚未创建表,则只需在表声明中添加将其指定为serial的字段即可。但不要忘记也将其声明为primary key,以确保将其视为此类。

这将创建并填充(由于其固有的默认值) id 列,并在单个事务中使用连续的数字。

请注意,根据表的大小,可能要花费大量时间。

此外,对于大型表,您可能需要考虑使用 bigserial 而不是 serial

关于将 id 分配给刚插入的行,可以在插入语句中添加returning id子句,使其像选择一样返回行(或多行(如果使用单个语句插入多个行)(当然也可以使用returning *returning _whatever_columns_you_want_

答案 2 :(得分:0)

我听起来您想跟踪基于该参数的“ runid”。这将是一个单独的实体。我建议这样的数据结构:

create table runs (
    runid serial primary key,
    parameter varchar(255),
    createdAt timestamp default current_timestamp
);

然后,您将在表中包括runid,并用外键引用runs

最后,您可以通过执行以下操作将其插入表中:

with r as (
      insert into runs (v_parameter)
          values (parameter)
          returning *
     )
insert into yourtable ( . . . , runid)
    select . . ., r.runid
    from . . . cross join
         r;