sql >> Databáze >  >> RDS >> PostgreSQL

Vkládání sebereferenčních záznamů do Postgresql

Last_value můžete vybrat ze sekvence, která se automaticky vytvoří, když použijete typ serial:

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)

A zdá se, že následující ještě jednodušší funguje také:

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

I když nevím, jak by to fungovalo při použití více sekvencí... Vyhledal jsem to; lastval() vrací poslední hodnotu vrácenou nebo nastavenou posledním voláním nextval nebo setval jakékoli sekvenci, takže následující by vás dostalo do potíží:

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".

Nicméně následující by bylo v pořádku:

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

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



  1. nejlepší způsob, jak sledovat změny dat v oracle

  2. Získání chyby ORA - 00907 v následující části ON UPDATE

  3. Žádné události onMessage v prostředí Runtime (Java JMS MessageListener na Oracle Queue)

  4. Push Notification ze zařízení na zařízení přes místní síť BEZ C2DM