sql >> Database >  >> RDS >> PostgreSQL

Zelfreferentiële records invoegen in Postgresql

U kunt last_value selecteren uit de reeks, die automatisch wordt aangemaakt wanneer u het type serial gebruikt:

create table test (
  id serial primary key,
  parent integer not null,
  foreign key (parent) references test(id)
);

insert into test values(default, (select last_value from test_id_seq));
insert into test values(default, (select last_value from test_id_seq));
insert into test values(default, (select last_value from test_id_seq));

select * from test;
 id | parent
----+--------
  1 |      1
  2 |      2
  3 |      3
(3 rows)

En het volgende lijkt nog eenvoudiger te werken:

insert into test values(default, lastval());

Hoewel ik niet weet hoe dit zou werken bij het gebruik van meerdere reeksen... Ik heb het opgezocht; lastval() retourneert de laatste waarde die is geretourneerd of ingesteld met de laatste nextval- of setval-aanroep naar een willekeurige reeks, dus het volgende zou u in de problemen kunnen brengen:

create table test (
  id serial primary key,
  foo serial not null,
  parent integer not null,
  foreign key (parent) references test(id)
);

select setval('test_foo_seq', 100);

insert into test values(default, default, lastval());
ERROR:  insert or update on table "test" violates foreign key constraint "test_parent_fkey"
DETAIL:  Key (parent)=(101) is not present in table "test".

Het volgende zou echter in orde zijn:

insert into test values(default, default, currval('test_id_seq'));

select * from test;
 id | foo | parent
----+-----+--------
  2 | 102 |      2
(1 row)



  1. dbsaint - Formulier ophalen EXCEL

  2. Hoe kan ik dit oplossen Ofwel de parameter @objname is dubbelzinnig of de geclaimde @objtype (COLUMN) is verkeerd.?

  3. Alle gebouwen binnen een bereik van 5 mijl van de opgegeven coördinaten krijgen

  4. Betekenis van Selecteer tabellen weg geoptimaliseerd in MySQL Explain plan