Мне нужна функция upsert, которая возвращает (новый / существующий) идентификатор строки.
Ссылка на мой предыдущий вопрос. Ранее я спрашивал о правиле postgres создать правило при вставке ничего не делать, если существует вставка в противном случае; RETURNING id но похоже, что это невозможно.
Итак, я прибегаю к триггеру
CREATE OR REPLACE FUNCTION upsert_asset() RETURNS trigger AS $trigger_bound$
BEGIN
INSERT INTO asset(symbol, name, type, status)
VALUES (NEW.symbol, NEW.name, NEW.type, NEW.status)
ON CONFLICT (symbol) DO UPDATE SET symbol = EXCLUDED.symbol;
RETURN NEW;
END;
$trigger_bound$
LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER upsert_asset_trigger
AFTER INSERT ON asset
FOR EACH ROW
EXECUTE PROCEDURE upsert_asset();
Я проверял выше и работает. Итак, мои вопросы
- Является ли этот триггер правильным способом для достижения этой функциональности? Есть ли какие-либо проблемы с расой / проблемы с производительностью, о которых мне следует знать?
- Как можно обобщить этот запрос, не задавая имена столбцов? актив (символ, имя, тип, статус). я не хочу обращать внимание на это правило каждый раз, когда меняю стол. Можно ли сказать NEW. * Или column. * Или что-то еще? Какие psuedorelations доступны для достижения этой цели? Обратите внимание, что есть также некоторые столбцы по умолчанию. Так как же NEW.default_column получить значение, если оператор вставки оставил этот столбец в операторе вставки?
Спасибо,