0

I have table and function:

create table test_temporal (
  id SERIAL,
  name varchar(16)
);

create or replace function test_temporal_insert()
returns trigger as $$
begin
INSERT INTO test_temporal ( id, name )
values ( coalesce( new.id, DEFAULT ), new.name );
return NEW;
end;
$$ language plpgsql;

But when I try to insert I get error:

insert into test ( name ) values ( 'a' );

ERROR:  DEFAULT is not allowed in this context
LINE 2: values ( coalesce( new.id, DEFAULT ), new.name )
                                   ^
QUERY:  INSERT INTO test_temporal ( id, name )
values ( coalesce( new.id, DEFAULT ), new.name )
CONTEXT:  PL/pgSQL function test_temporal_insert() line 3 at SQL statement

In my trigger I need to generate next value from sequence (DEFAULT) if user does not provide value for id. If user provide value for id I should use it (new.id)

How to insert DEFAULT value when no new.id is supplied?

The dbfiddle

Eugen Konkov
  • 22,193
  • 17
  • 108
  • 158

1 Answers1

0

I resolve that via condition:

create or replace function test_temporal_insert()
returns trigger as $$
begin
IF( new.id is null ) THEN
  INSERT INTO test_temporal ( name )
  values ( new.name );
ELSE
  INSERT INTO test_temporal ( id, name )
  values ( new.id, new.name );
END IF;
return NEW;
end;
$$ language plpgsql;

It would be much clear if Postgresql allow coalesce( new.id, DEFAULT ):

INSERT INTO test_temporal ( id, name )
values ( coalesce( new.id, DEFAULT ), new.name );
Eugen Konkov
  • 22,193
  • 17
  • 108
  • 158