sql >> Database teknologi >  >> RDS >> PostgreSQL

Indsættelse af selvrefererende poster i Postgresql

Du kan vælge last_value fra sekvensen, der automatisk oprettes, når du bruger typen 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)

Og følgende endnu enklere ser også ud til at virke:

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

Selvom jeg ikke ved, hvordan dette ville fungere, når du bruger flere sekvenser... Jeg slog det op; lastval() returnerer den sidste værdi, der er returneret eller sat med det sidste nextval- eller setval-kald til en hvilken som helst sekvens, så følgende ville få dig i problemer:

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

Men følgende ville være i orden:

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

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



  1. SQLite i Android:Foreign Keys og <table constraint> forventes

  2. Hvordan ændrer jeg kolonnens standardværdi i PostgreSQL?

  3. SQL to kriterier fra én gruppe-by

  4. mysql - kolonne kan ikke være null