PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Вмъкване на самореферентни записи в Postgresql

Можете да изберете last_value от последователността, която се създава автоматично, когато използвате тип 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)

И следното още по-просто изглежда също работи:

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

Въпреки че не знам как ще работи това при използване на множество последователности... Погледнах го; lastval() връща последната върната или зададена стойност с последното nextval или setval извикване на която и да е последователност, така че следното ще ви създаде проблеми:

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

Следното обаче би било добре:

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

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли начин да проникнете в база данни на PostgreSQL, ако сте забравили паролата?

  2. Postgres enum в TypeORM

  3. Връщане на редове от INSERT с ON CONFLICT без необходимост от актуализиране

  4. Postgres:извлича текст до N-тия знак в низ

  5. Писане на функция в SQL за преминаване през диапазон от дати в UDF