2
基线的要求是建立在格式订单号:自定义自动递增字段(发票/订单号)
(M)M-SSS
其中MM代表当前月份和SSSS代表的顺序那个月的序列。例如1-002将代表1月份提交的第二份订单。
使用TRIGGER我希望自动增量和插入透明地工作。
不幸的是,它已经很长时间,因为我已经触摸了一个存储过程,这是我第一次进入postgresql。任何帮助指向正确的方向将不胜感激。
更新:下面是一个使用@ peterm代码
-- The trigger
CREATE TRIGGER add_order_number
BEFORE INSERT ON orders FOR EACH ROW
EXECUTE PROCEDURE order_number_update();
-- The trigger function
CREATE FUNCTION order_number_update() RETURNS TRIGGER AS $$
DECLARE
next_order TEXT;
BEGIN
-- get the next order number
SELECT INTO next_order CONCAT(CAST(DATE_PART('MONTH', CURRENT_DATE) AS VARCHAR(2)),
'-',
LPAD(CAST(COALESCE(CAST(RIGHT(MAX(order_number), 3) AS INT), 0) + 1 AS VARCHAR(3)), 3, '0'))
FROM orders
WHERE CAST(LEFT(order_number, STRPOS(order_number, '-') - 1) AS INT) = DATE_PART('MONTH', CURRENT_DATE);
-- update the field
NEW.order_number = next_order;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
注意最终的实现:通过添加更新为BEFORE INSERT触发它的功能在完全透明的和可预测的方式,就像一个正常的SERIAL或BIGSERIAL字段。
@EvanPlaice查看更新的答案。该查询的第一个版本是基于假定月份部分固定了两个字符串MM而构建的。 – peterm
@EvanPlaice这很愚蠢。这里是[sqlfiddle](http://sqlfiddle.com/#!1/798aa/2),它使用字段名称'order_number'。这意味着你在你的代码中有一些错字。 – peterm
我是个笨蛋,我正在使用pgadmin来检查代码,并没有将UI输出拖到正确的位置以查看完整的结果。 –