все параметры одинаковые, количество CNT=1, 2 раза срабатывает, потом в остатках все время 2 и пишет, что 0 rows affected
INSERT INTO ams(
acaid, adate, amodid, acnt, apriceto
)
VALUES (
?acaid, ?adate, ?amodid, ?acnt, COALESCE((select * from getprice(?adate,?amodid)),-1)
) ON CONFLICT ON CONSTRAINT ams_idx DO UPDATE SET acnt = ?acnt + EXCLUDED.acnt
returning acnt;
Ни схемы таблицы, ни настоящего запроса... Вам точно нужна помощь? ;)
Таблица: CREATE TABLE bash.ams ( acaid INTEGER NOT NULL, adate DATE NOT NULL, amodid INTEGER NOT NULL, acnt coms.d_cnt NOT NULL, apriceto coms.d_price DEFAULT 0 NOT NULL, CONSTRAINT ams_idx PRIMARY KEY(acaid, adate, amodid) USING INDEX TABLESPACE indxs ) TABLESPACE ams; вот упрощенный запрос - суть - только количество, оно после достижения 2 не меняется. По идее, должно с каждым запросом инкрементироваться на 1 INSERT INTO ams( acaid, adate, amodid, acnt, apriceto ) VALUES ( 1, '2023-10-19', 2, 1, COALESCE((select * from getprice('2023-10-19', 2)),-1) ) ON CONFLICT ON CONSTRAINT ams_idx DO UPDATE SET acnt = 1 + EXCLUDED.acnt returning acnt;
Можэт, у вас тип acnt какой-то придурочный?
не, обычный православный numeric(15,3)
Вобще-то нифига, У тебя там coms.d_cnt
ну так то домен нумерика, там никакой магии, просто алиас
Тогда УМВР https://sqlize.online/sql/psql15/6094b21449db743936b702309a52af46/
Ну, не всё — тебе по смыслу надо не на 1, а на EXCLUDED.acnt увеличивать. Но никаких "на 2".
Кстати... зря Вы используете ON CONSTRAINT название — переименуете индекс, и запрос "сломается". Лучше поля указывать, чтобы constraint inference находил нужный индекс автоматически.
а разве даст переименовать? Я так понял постгри даже превентивно не дает что-то переименовать, если есть хоть где-то сcыль на объект :)))
А это бывает очень редко.
Откуда PostgreSQL вообще знать о существовании такого запроса где-то в клиентском приложении, извините?!
ну индекс на стороне сервера, индекс просто так не переименовать
ALTER INDEX ams_idx RENAME TO new_name; Всё.
Обсуждают сегодня