Если ваши данные вставляются последовательно, я бы более склонен использовать id
для сравнения, как в:
insert into event (state, datetime, product_id)
select 'AVAILABLE', current_timestamp, product_id
from event e
where e.state = 'PROCESSED' and
not exists (select e2.state
from event e2
where e2.product_id = e.product_id and
e2.id > e.id -- you can use timestamp
);
Меня больше интересует то, что вы сказали, что state
являетсяenum
.Postgres поддерживает поддерживаемых перечисляемых типов , и у вас его нет.Однако то, что вы хотите сделать, часто обрабатывается с помощью проверочного ограничения:
CREATE TABLE EVENT (
ID BIGSERIAL,
STATE VARCHAR(64) NOT NULL,
DATETIME TIMESTAMP NOT NULL,
PRODUCT_ID BIGINT,
FOREIGN KEY (PRODUCT_ID) REFERENCES PRODUCT(ID),
PRIMARY KEY (ID),
CONSTRAINT CHECK_EVENT_STATE CHECK (STATE IN ('INITIALIZED', 'AVAILABLE', 'PROCESSED'))
);