【问题标题】:Is it possible to write a postgres function that will handle a many to many join?是否可以编写一个处理多对多连接的 postgres 函数?
【发布时间】:2016-06-23 11:21:56
【问题描述】:

我有一张工作表。我有一个行业表。工作和行业通过一个称为行业工作的连接表具有多对多关系。两个表都有 uuid 是它们的主键。我的问题是两方面的。首先,编写两个函数来插入这样的数据是否可行?如果这是可行的,那么我的第二个问题是如何表达 uuid 列类型的数组。我不确定语法。

CREATE OR REPLACE FUNCTION linkJobToIndustries(jobId uuid, industiresId uuid[]) RETURNS void AS $$
DECLARE
    industryId uuid[];
BEGIN
    FOREACH industryId SLICE 1 IN ARRAY industriesId LOOP
        INSERT INTO industriesjobs (industry_id, job_id) VALUES (industryId, jobId);
    END LOOP;
    RETURN;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION insertJobWithIndistries(orginsation varchar, title varchar, addressId uuid, industryIds uuid[]) RETURNS uuid AS $$
DECLARE
    jobId uuid;
BEGIN
    INSERT INTO jobs ("organisation", "title", "address_id") VALUES (orginsation, title, addressId)  RETURNING id INTO jobId;
    SELECT JobbaLinkJobToIndustries(jobId, industryIds);
END;
$$ LANGUAGE plpgsql;

SELECT jobId FROM insertJobWithIndistries(
    'Acme Inc'::varchar, 
    'Bomb Tester'::varchar, 
    '0030cfb3-1a03-4c5a-9afa-6b69376abe2e',
    { 19c2e0ee-acd5-48b2-9fac-077ad4d49b19, 21f8ffb7-e155-4c8f-acf0-9e991325784, 28c18acd-99ba-46ac-a2dc-59ce952eecf2 }
);

提前致谢。

【问题讨论】:

    标签: postgresql function insert many-to-many plpgsql


    【解决方案1】:

    解决方案的关键是函数unnest() (根据文档):

    将数组扩展为一组行

    还有一个data-modifying CTE

    一个简单的查询就可以完成这项工作:

    WITH ins_job AS (
       INSERT INTO jobs (organisation, title, address_id)
       SELECT 'Acme Inc', 'Bomb Tester', '0030cfb3-1a03-4c5a-9afa-6b69376abe2e'  -- job-data here
       RETURNING id
       )
    INSERT INTO industriesjobs (industry_id, job_id)
    SELECT indid, id
    FROM   ins_job i  -- that's a single row, so a CROSS JOIN is OK
         , unnest('{19c2e0ee-acd5-48b2-9fac-077ad4d49b19
                  , 21f8ffb7-e155-4c8f-acf0-9e9913257845
                  , 28c18acd-99ba-46ac-a2dc-59ce952eecf2}'::uuid[]) indid;  -- industry IDs here
    

    还演示了uuid 数组的正确语法。 (元素和分隔符之间的空格不相关,但不在双引号内。)

    您的一个 UUID 短一个字符:
    21f8ffb7-e155-4c8f-acf0-9e991325784
    必须是这样的:
    21f8ffb7-e155-4c8f-acf0-9e9913257845 -- 多一个字符

    如果你需要函数,你也可以这样做:

    CREATE OR REPLACE FUNCTION link_job_to_industries(_jobid uuid, _indids uuid[])
      RETURNS void AS
    $func$
       INSERT INTO industriesjobs (industry_id, job_id)
       SELECT _indid, _jobid
       FROM   unnest(_indids) _indid;
    $func$ LANGUAGE sql;
    

    等等

    相关:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2020-12-16
      • 2017-10-24
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多