Zvláštní chování při nastavení defauzlt na currval

21 views
Skip to first unread message

Jan Michálek

unread,
Feb 17, 2025, 12:19:54 PMFeb 17
to postgr...@googlegroups.com
Čau
Narazil jsem na zvláštní chování u jedné konkrétní databáze. K záznamům chci držet odkaz k metadatům (viz kód) - založím řádek v metadatech, kde mam GENERATED AS ID a z té sekvence pak vkládám currval - opakovaně jsem to takto použil. Ale u jedné databáze se mi to chová, jako kdyby jsem se snažil do té tabulky vkládat záznamy (viz ukázka). Máme tam pgpool, když to založím načisto, tak mi to projde. Pokud udělám kopii konkrétní databáze, kde mi to zlobí (CREATE WITH TEMPLATE), tak to v tý kopii zlobí taky. Může to dělat ten pgpool?

Díky Je;

Border style is 2.
Line style is unicode.
Unicode header line style is "double".
psql (17.2, server 12.19)
Type "help" for help.

cz_demo_copy=# BEGIN;
BEGIN
cz_demo_copy=*# CREATE TABLE metadata.zdroje (
    id int PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    filename varchar,
    datum_importu date default now()::date,
    datum_zapisu timestamp,
    datum_platnosti timestamp
);


ALTER TABLE data.pozemnikomunikace ADD COLUMN zdroje_id int REFERENCES metadata.zdroje(id) ON DELETE RESTRICT default currval('metadata.zdroje_id_seq'::regclass);
CREATE TABLE
ERROR:  currval of sequence "zdroje_id_seq" is not yet defined in this session
cz_demo_copy=!#


--
Jelen
Starší čeledín datovýho chlíva

Peter

unread,
Feb 17, 2025, 1:10:27 PMFeb 17
to PostgreSQL-cz
A nebude to iba tym, ze ta ALTERovana tabulka (data.pozemnikomunikace) je v case ALTER TABLE neprazdna, a preto sa snazi existujucim riadkom nastavit default hodnotu noveho stlpca?
To by vysvetlovalo, preco to prejde pri "zalozeni nacisto", ale uz nefunguje pri kopii z template.

Riesenim by bolo najprv pridat stlpec bez DEFAULT + bez CONSTRAINT, potom UPDATEovat data podla metadata.zdroje, pridat constraint a nakoniec ATLER TABLE data.pozemnikomunikace ALTER zdroje_id SET DEFAULT currval('metadata.zdroje_id_seq'::regclass);
Alebo najprv spravit TRUNCATE data.pozemnikomunikace; az potom ALTER TABLE.

Inak zaujimavy dizajn - zatial som sa s tym nestretol. Z nejakeho dovodu sa mi to az tak moc nepaci. Obmedzuje to insert/update toho stlpca na velmi konkretny call-stack a javi sa mi tazko debugovatelny. Predstavujem si skarede scenare s triggermi, FDW tabulkami, views, ...


.pl.

Pavel Stehule

unread,
Feb 17, 2025, 1:47:37 PMFeb 17
to postgr...@googlegroups.com


po 17. 2. 2025 v 18:19 odesílatel Jan Michálek <godzil...@gmail.com> napsal:

pokud takhle altrujes neprazdnou tabulku, tak je jasny, ze si koledujes o pruser, a to ze ti to funguje je spis nahoda, jestli se v te dane session nahodou insertovalo metadata.zdroje.

Jinak to spadnout musi. Neznam uplne pgpool, takze nevim jestli nedrzi session - treba pgbouncer v transaction modu urcite ne. A kazdy prikaz v session pred poolerem muze jit do jinyho spojeni.

Je to dost creativni reseni (urcite je to dost krehky), ktery ale, pokud by se pustilo nad neprazdnou tabulkou nedava smysl.

V podstate to co delas, kdyz to prepisu mi spadne taky, a nepouzivam pgpool ani zadny jiny pooler

(2025-02-17 19:44:29) postgres=# create sequence s;
CREATE SEQUENCE
(2025-02-17 19:44:34) postgres=# create table foo(a int);
CREATE TABLE
(2025-02-17 19:44:44) postgres=# insert into foo values(10);
INSERT 0 1
(2025-02-17 19:44:53) postgres=# alter table foo add column b int default (currval('s'));
ERROR:  currval of sequence "s" is not yet defined in this session

Spis je otazkou proc ti to nekde nepada?

Pavel






--
Jelen
Starší čeledín datovýho chlíva
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Tuto diskuzi najdete na adrese https://groups.google.com/d/msgid/postgresql-cz/CAAYBy8bNKYVEEBtD52_Y6L3uqkWtqJizJ%2Bjc-p6cADmAWryDyw%40mail.gmail.com.

David Turoň

unread,
Feb 18, 2025, 1:44:41 AMFeb 18
to postgr...@googlegroups.com
Obcne currval muzes pouzit az pokud nekde sekvenci pouzije v session s nextval - si myslim, ze jinde ti to mohlo fungovat tak, ze ti neco zapsalo uz do tabulky a nejspis pgpool ti podhodil session kde uz zapsal do tabulky s nextval:

postgres@test=# CREATE SEQUENCE test;
CREATE SEQUENCE
Čas: 8,552 ms
postgres@test=# SELECT currval('test');
ERROR:  currval of sequence "test" is not yet defined in this session
Čas: 5,643 ms
postgres@test=# SELECT nextval('test');
 nextval
---------
       1
(1 řádka)

Čas: 4,994 ms
postgres@test=# SELECT currval('test');

 currval
---------
       1
(1 řádka)

Hadam ze proto ti to fungovalo ... ale asi jak pisou ostatni neni to asi uplne dobry napad.

David

po 17. 2. 2025 v 18:19 odesílatel Jan Michálek <godzil...@gmail.com> napsal:
Čau

--

Jan Michálek

unread,
Feb 18, 2025, 3:52:34 AMFeb 18
to postgr...@googlegroups.com
Já jsem ale osel. Na tohle jsem teda měl přijít sám. Díky moc, je to jak píšeš.

Je;

po 17. 2. 2025 v 19:10 odesílatel Peter <pgs...@gmail.com> napsal:
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „PostgreSQL-cz“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.

Jan Michálek

unread,
Feb 18, 2025, 4:03:46 AMFeb 18
to postgr...@googlegroups.com
Díky všem. Problém byl opravdu v tom, že jsem tu tabulku neměl prázdnou. No, to jsem kus osla.

Díky za pomoc.
Je;

út 18. 2. 2025 v 7:44 odesílatel David Turoň <turon...@gmail.com> napsal:
Reply all
Reply to author
Forward
0 new messages