【问题标题】:Inserting row types with a serial primary key column in PostgreSQL在 PostgreSQL 中插入具有串行主键列的行类型
【发布时间】:2022-11-28 18:45:34
【问题描述】:

我无法插入行类型,因为ID列为空。

CREATE TABLE
  some_table (
    "id" SERIAL PRIMARY KEY,
    "some_value" VARCHAR NOT NULL
  );
declare
    r_some_table_rt some_table%rowtype;
begin
    select *
    into r_some_table_rt
    from some_table
    where some_column = 'Some value';

  if r_some_table_rt.id is null then
    -- r_some_table_rt.id := default; -- Tried this
    -- r_some_table_rt.id := currval(pg_get_serial_sequence('some_table', 'id')); -- And this
    r_some_table_rt.some_column := 'Some value';

    insert into some_table
    values (r_some_table_rt.*)
    returning id into r_some_table_rt.id;

  end if;

  return r_some_table_rt.id;
end;

PostgresError: null value in column "id" of relation "some_table" violates not-null constraint

我尝试了以下

  1. 使用普通插入件效果很好:insert into some_table (some_column) values ('Some value');
  2. r_some_table.id := default; -> PostgresError: DEFAULT is not allowed in this context
  3. r_some_table.id := currval(pg_get_serial_sequence('some_table', 'id')); -> PostgresError: currval of sequence "some_table_id_seq" is not yet defined in this session

【问题讨论】:

  • 如果您想复制一行,那么为什么不使用 INSERT .. SELECT?

标签: postgresql insert primary-key default rowtype


【解决方案1】:

这对我有用:

r_some_table_rt.id := nextval(pg_get_serial_sequence('some_table', 'id'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多