Установить триггер вставки - значение на максимальное значение в столбце + 1 - PullRequest
0 голосов
/ 26 октября 2018

У меня есть таблица списков со следующими столбцами

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 голосов
/ 26 октября 2018

вы можете попытаться создать хранимую процедуру примерно так:

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
0 голосов
/ 26 октября 2018

Вы можете настроить триггер. Или вы можете настроить логику непосредственно в insert:

insert into lists (category_id, name, sort_order)
    select category_id, name,
           coalesce(max(sort_order) + 1, 1)
    from (values (?, ?)) v(category_id, name) left join
         lists l
         using (category_id)
    group by v.category_id, v.name;

Обратите внимание, что такой запрос может иметь условия гонки. Итак, вы можете пойти по пути использования триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...