将插入触发器设置为列+ 1中的最大值

时间:2018-10-26 19:09:55

标签: sql postgresql

我有一个包含以下各列的列表表

lists:
- id
- category_id
- name
- sort_order

在表中添加新行时,我想将排序顺序的值设置为最高排序顺序值+ 1,其中category_id与新行的category_id相同。有没有办法做到这一点?

更新 因此,在推荐创建插入触发器的过程中,我尝试了

CREATE FUNCTION set_list_sort_order()
RETURNS trigger AS $$
BEGIN
  NEW.sort_order := select (select sort_order from lists where category_id = NEW.category_id order by sort_order DESC limit 1) + 1
  RETURN NEW;
END 
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER set_list_sort_order_trigger
BEFORE INSERT ON lists
FOR EACH ROW
EXECUTE PROCEDURE set_list_sort_order()

但是我得到这个错误:

ERROR:  syntax error at or near "select"
LINE 4:   NEW.sort_order := select (select sort_order from lists w...

2 个答案:

答案 0 :(得分:1)

您可以设置触发器。或者,您可以直接在x = Retriable.retriable do some_function(1, 2) end 中设置逻辑:

insert

请注意,这样的查询可能具有竞争条件。因此,您可能想要使用触发器。

答案 1 :(得分:0)

您可以尝试使用以下内容创建存储过程:

DEClARE @category_id INT = 1

;WITH NextNum AS 
(
    SELECT 
            CASE 
                WHEN MAX(Table1.sort_order) IS NULL THEN 1 
                ELSE MAX(Table1.sort_order) + 1
            END AS NextValue 
    FROM Table1 AS Table1
    WHERE Table1.category_id = @category_id
) 
INSERT INTO Table1
(
    id
    category_id
    name
    sort_order
)
SELECT  @id, 
        @category_id
        @name 
        NextNum.NextValue
    FROM NextNum