powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоинкрементные поля
2 сообщений из 2, страница 1 из 1
Автоинкрементные поля
    #32723106
jumperFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть табличка с полем ID SERIAL NOT NULL .
В неё таким образом было вставлено 10 записей:
Код: plaintext
1.
INSERT INTO User (ID, name) VALUES ( 1 , 'Вася Пупкин');
INSERT INTO User (ID, name) VALUES ( 2 , 'Степан Глюкавый');
...
Теперь, если я хочу добавить запись через
Код: plaintext
INSERT INTO User (name) VALUES ('Василий Тёркин');
PostgreSQL кричит
Код: plaintext
ERROR:  duplicate key violates unique constraint "user_pkey"
И кричит так пока я вставляю 10 раз новую запись, после этого начинает добавлять.
За сим вопрос, есть ли у PostgreSQL автоинкрементые поля что бы сами искали максимальный ID и начинали отсчёт с него?

Заранее спасибо.
...
Рейтинг: 0 / 0
Автоинкрементные поля
    #32723119
PJD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PJD
Гость
Таких, чтобы делали все сами - нет. Нужно делать setval('sequence_name') после вставки вручную или в триггере на insert.
Примерно так (для восьмерки):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create table tuser(
  id serial primary key,
  name text
);

create or replace function fti_sequence_id() returns trigger as $_$
declare 
  v_seq_name text;
  v_id   int;
  v_curr int;
begin
  v_seq_name := TG_ARGV[ 1 ];
  v_id := NEW.id;  --имя serial-поля - id 
  begin
    v_curr := currval(v_seq_name);
  exception
    when OTHERS then v_curr :=  0 ;
  end;
   --при одновременной явной вставке id из разных процессов будут проблемы 
  if v_id > v_curr then
    raise notice 'setval(\'%\',%)', v_seq_name, v_id;
    perform setval(v_seq_name, v_id);
  end if;
  return NEW;
end;
$_$ language plpgsql;

create trigger ti_tuser_sequence after insert on tuser 
  for each row execute procedure fti_sequence_id('id', 'tuser_id_seq');


insert into tuser select  2 , 'петров';
insert into tuser select  3 , 'сидоров';
insert into tuser select s.i, 'кузнецов' from generate_series( 4 , 10 ) s(i);
insert into tuser select  1 , 'иванов';

insert into tuser (name) select 'козлов';
select currval('tuser_id_seq');
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоинкрементные поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]