Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблемы с nextval / 12 сообщений из 12, страница 1 из 1
16.11.2017, 21:02
    #39554680
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
Коллеги,
Помогите решить проблему, в MSSQL это работало!

Есть первичный ключ типа SERIAL.

Делаю вставку из скрипта и указываю значения ключа в явном виде (это нужно по бизнесу)

insert into S_ACCOUNT (ACCOUNTID,CREATED) values (1, current_timestamp);
все работает,
но после того как добавлю новую запись через функцию
insert into S_ACCOUNT(CREATED) values (current_timestamp)

пишет ошибку что '1' уже присоен записи.

В MSSQL то решалось опцией IDENTITY_INSERT. После ее выключения, после вставки напрямую через скрипт ключи генерились с учетом уже занятых id.

Как решить эту неожиданную проблему?
...
Рейтинг: 0 / 0
16.11.2017, 22:20
    #39554706
Victor Nevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewew,

не верю!!!

тестовый пример в студию
...
Рейтинг: 0 / 0
16.11.2017, 22:37
    #39554708
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
Victor Nevsky,
create table S_ACCOUNT (
ACCOUNTID SERIAL not null,
CREATED TIMESTAMP not null
);

alter table S_ACCOUNT
add constraint PK_S_ACCOUNT primary key (ACCOUNTID);

/*==============================================================*/
/* Index: XP_ACCOUNTID */
/*==============================================================*/
create unique index XP_ACCOUNTID on S_ACCOUNT (
ACCOUNTID
);
...
Рейтинг: 0 / 0
16.11.2017, 22:38
    #39554709
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewew,
insert into S_ACCOUNT (ACCOUNTID,CREATED) values (1, current_timestamp);

insert into S_ACCOUNT (ACCOUNTID,CREATED) values (2, current_timestamp);
...
Рейтинг: 0 / 0
16.11.2017, 22:39
    #39554710
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewew,
drop function SystemAccount_Add;

CREATE OR REPLACE FUNCTION SystemAccount_Add (
UserId integer)
RETURNS integer AS
$BODY$
declare newAccountid integer = null;

BEGIN

insert into S_ACCOUNT(CREATED)
values (current_timestamp) RETURNING ACCOUNTID INTO STRICT newAccountid;
-- обработчик ошибок
return newAccountid;
END
$BODY$
LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
16.11.2017, 22:50
    #39554712
Victor Nevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewewwewewew,
insert into S_ACCOUNT (ACCOUNTID,CREATED) values (1, current_timestamp);

insert into S_ACCOUNT (ACCOUNTID,CREATED) values (2, current_timestamp);

и кто, sequence, скажет, что оно не используется (обновись ....))))
setval в помощь ....

зы
что за ересь ...
и зачем тут serial ....?
...
Рейтинг: 0 / 0
16.11.2017, 23:26
    #39554714
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewew,

SERIAL в Postgres-е — суть последовательность, владельцем которой является колонка в таблице и этой колонке присваивается `DEFAULT nextval()` выражение (синтаксическая обёртка).
Если вы будете руками вставлять значения в эту колонку, то последовательность не будет меняться, что и приведёт к ошибке, которую вы видите.

Вместо `VALUES (1, current_timestamp)` можно использовать `VALUES (nextval(), current_timestamp)`.
...
Рейтинг: 0 / 0
17.11.2017, 08:54
    #39554828
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
vyegorovwewewew,

SERIAL в Postgres-е — суть последовательность, владельцем которой является колонка в таблице и этой колонке присваивается `DEFAULT nextval()` выражение (синтаксическая обёртка).
Если вы будете руками вставлять значения в эту колонку, то последовательность не будет меняться, что и приведёт к ошибке, которую вы видите.

Вместо `VALUES (1, current_timestamp)` можно использовать `VALUES (nextval(), current_timestamp)`.
Большое спасибо! Заработало!
...
Рейтинг: 0 / 0
17.11.2017, 08:55
    #39554830
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
Victor Nevsky,
serial как я понял используют для первичных ключей с автоинкриментом.
Разве нет?
...
Рейтинг: 0 / 0
17.11.2017, 09:32
    #39554854
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewew,

vyegorov вам уже написал, что SERIAL это обёртка. по факту это INTEGER с DEFAULT nextval('table_id_field_name.seq').
...
Рейтинг: 0 / 0
17.11.2017, 09:42
    #39554861
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
wewewew,

почитайте про SERIAL и про сиквенсы , а праймари кей из поля делает индекс .
...
Рейтинг: 0 / 0
17.11.2017, 14:49
    #39555105
wewewew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемы с nextval
Lonepsychowewewew,

почитайте про SERIAL и про сиквенсы , а праймари кей из поля делает индекс .

Спасибо! Теперь у меня у меня заработала и ручная и автоматическая вставка!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблемы с nextval / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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