2013-05-16 51 views
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字段。

回答

2

你在找这样的吗?

-- Next No calculated for current month 
SELECT CONCAT(CAST(DATE_PART('MONTH', CURRENT_DATE) AS VARCHAR(2)), 
     '-', 
     LPAD(CAST(COALESCE(CAST(RIGHT(MAX(order_no), 4) AS INT), 0) + 1 AS VARCHAR(4)), 4, '0')) next_no 
    FROM orders 
WHERE CAST(LEFT(order_no, STRPOS(order_no, '-') - 1) AS INT) = DATE_PART('MONTH', CURRENT_DATE) 
; 

输出:

| NEXT_NO | 
----------- 
| 5-0001 | 

假设存在与order_no = '1-0001' 然后

-- Next No for January 
SELECT CONCAT(CAST(DATE_PART('MONTH', DATE '2013-01-01') AS VARCHAR(2)), 
     '-', 
     LPAD(CAST(COALESCE(CAST(RIGHT(MAX(order_no), 4) AS INT), 0) + 1 AS VARCHAR(4)), 4, '0')) next_no 
    FROM orders 
WHERE CAST(LEFT(order_no, STRPOS(order_no, '-') - 1) AS INT) = DATE_PART('MONTH', DATE '2013-01-01') 
; 

输出的记录:

| NEXT_NO | 
----------- 
| 1-0002 | 

SQLFiddle

+0

@EvanPlaice查看更新的答案。该查询的第一个版本是基于假定月份部分固定了两个字符串MM而构建的。 – peterm

+0

@EvanPlaice这很愚蠢。这里是[sqlfiddle](http://sqlfiddle.com/#!1/798aa/2),它使用字段名称'order_number'。这意味着你在你的代码中有一些错字。 – peterm

+0

我是个笨蛋,我正在使用pgadmin来检查代码,并没有将UI输出拖到正确的位置以查看完整的结果。 –