Я недавно начал использовать PostgreSQL, и я стараюсь делать вещи «правильно», как я понял. Это означает, что на сервере базы данных должно быть как можно больше работы, а не на клиенте.
Итак, я создал функцию с PL / pgSQL, которая будет добавлять данные в таблицу. Поскольку для этой таблицы установлено ограничение первичного ключа, а указанный ключ может не существовать в то время, когда я пытаюсь добавить новые данные, я добавил перехват исключений, который создаст ключ, а затем попытается вставить снова новый ряд.
Это работает удовлетворительно для меня, но мне любопытно, справляюсь ли я с этим "правильным способом". Я пытался найти какое-то руководство по разработке этих пользовательских функций, но на самом деле я не нашел ничего полезного.
CREATE OR REPLACE FUNCTION add_product_price_promo_xml(v_product_code varchar, v_description varchar, v_product_group varchar,
v_mixmatch_id integer, v_price_at date, v_cost_price numeric, v_sales_price numeric,
v_tax_rate integer) RETURNS void AS $$
BEGIN
INSERT INTO product_prices (product_code , mixmatch_id , price_at , cost_price , sales_price , tax_rate) VALUES
(v_product_code, v_mixmatch_id, v_price_at, v_cost_price, v_sales_price, v_tax_rate);
EXCEPTION WHEN foreign_key_violation THEN
INSERT INTO products (code, description, product_group) VALUES (v_product_code, v_description, v_product_group);
PERFORM add_product_price_promo_xml($1, $2, $3, $4, $5, $6, $7, $8);
END;
$$ LANGUAGE plpgsql;
База данных, о которой идет речь, будет использоваться для составления отчетов и будет ежедневно импортировать полный реестр товаров с обновлениями цен и новых товаров, но я не буду знать, какие товары новые, а какие старые. *