您可以使用EXTRACT()
功能的手動創建序列設置爲一個特定值:
setval('my_sequence',
(EXTRACT(YEAR FROM now())::integer * 1000000) +
(EXTRACT(MONTH FROM now())::integer * 10000)
);
進入將採取下一個值的序列,即YYYYMM0001等
訣竅在接下來的順序是什麼時候更新序列值。你可以做這裏面PG硬盤的方式,寫上您的訂單表BEFORE INSERT
觸發器來檢查,如果這是一個新的月份的第一個記錄:
CREATE FUNCTION before_insert_order() RETURNS trigger AS $$
DECLARE
base_val integer;
BEGIN
-- base_val is the minimal value of the sequence for the current month: YYYYMM0000
base_val := (EXTRACT(YEAR FROM now())::integer * 1000000) +
(EXTRACT(MONTH FROM now())::integer * 10000);
-- So if the sequence is less, then update it
IF (currval('my_sequence') < base_val)
setval('my_sequence', base_val);
END IF;
-- Now assign the order id and continue with the insert
NEW.id := nextval('my_sequence');
RETURN NEW;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER tr_bi_order
BEFORE INSERT ON order_table
FOR EACH ROW EXECUTE PROCEDURE before_insert_order();
爲什麼這是艱辛的道路?因爲您檢查每個插入的序列值。如果您每天只需插入少量插件,並且您的系統不是很忙,那麼這是一種可行的方法。
如果您不能備份所有這些CPU週期,您可以安排cron
作業在每月的每個第一天的00:00:01運行,以通過psql
執行PG功能來更新序列,然後只使用序列作爲新訂單記錄的默認值(因此不需要觸發器)。
對於這種情況,您不能使用序列,因爲事務失敗,序列可能會在數字中留下間隙:序列不會回滾。 –