我最近开始使用PostgreSQL,并且正在尝试按照我理解的方式“以正确的方式”执行操作。这意味着将尽可能多的工作放在数据库服务器上,而不是放在客户端上。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;
有问题的数据库将被用来做报告,将导入完整的项目注册,每天有价格的更新和新的项目,但我不知道哪些项目是新的,哪些是旧。
@EvanCarrorll,你能解释一下你的INSERT INTO ...查询到底在做什么吗? – jeffdill2 2016-01-11 01:54:28
@ jeffdill2截至目前,这是个不好的建议,我会全面更新。 – 2016-01-11 02:52:34
不是问题。我现在已经明白了。我只是通过使用'LEFT JOIN'并在连接表上检查'WHERE ... IS NULL'来实现类似于这种方法的东西。 – jeffdill2 2016-01-11 02:59:01