gpt4 book ai didi

sql - 在 PostgreSQL View 上插入或更新

转载 作者:行者123 更新时间:2023-11-29 11:36:04 25 4
gpt4 key购买 nike

我从 PostgreSQL View 开始,因为它们对我的用例很有用,并且会提供比函数更好的性能。

(这无关紧要,但我在 Heroku Postgres 上使用 Django 1.7 — 以防万一)。

我已经创建了一个 View 并且可以很好地查询它。我想围绕 View 编写一个 Django 包装器,这样我就可以像对待表一样对待它,并相应地查询和写入它。我一直在审查 Postgres docs on INSERT and UPDATE for views但老实说,我发现他们的文档很难读,我几乎无法解析他们在说什么。

假设我有以下观点:

CREATE OR REPLACE VIEW links AS
SELECT
listing.id AS listing_id,
CONCAT('/i-', industry.slug, '-j-', listing.slug, '/') AS link,
'https://www.example.com' || CONCAT(industry.slug, '-SEP-', listing.slug, '/') AS full_link,
listing.slug AS listing_slug,
industry.slug AS industry_slug
FROM listing
INNER JOIN company ON company.id = listing.company_id
INNER JOIN industry ON industry.id = company.industry_id

在这里,我使用 industry.sluglisting.slug 来构建链接。我希望能够从此 View 中更新这两个字段,如下所示:

UPDATE links
SET listing_slug = 'my-new-slug'
WHERE listing_id = 5;

如何创建规则以正确执行此操作?

最佳答案

因为双连接,你最好使用触发程序。要更新行业表,您首先需要使用外键 listing-company-industry 找到 industry.id。过程可能如下所示:

CREATE OR REPLACE FUNCTION update_listing_and_industry() RETURNS TRIGGER AS
$$
DECLARE _company_id int; _industry_id int;
BEGIN
_company_id = (SELECT company_id FROM listing WHERE id = OLD.listing_id);
_industry_id = (SELECT industry_id FROM company WHERE id = _company_id);

UPDATE listing SET slug = NEW.listing_slug WHERE id = OLD.listing_id;
UPDATE industry SET slug = NEW.industry_slug WHERE id = _industry_id;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;

注意:触发器过程是返回 TRIGGER 的正常过程。根据触发器的作用,过程必须返回 NEW 或 OLD(在本例中为 NEW)。

以及带有 INSTEAD OF UPDATE 子句的触发器:

CREATE trigger update_view INSTEAD OF UPDATE ON links 
FOR EACH ROW EXECUTE PROCEDURE update_listing_and_industry();

关于sql - 在 PostgreSQL View 上插入或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31508532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com