繁体   English   中英

如何在PostgreSQL中通过数组正确创建多个条目?

[英]How correctly create multiple entries by arrays in PostgreSQL?

PostgreSQL数据库中,我有一个如下表:

| question_id | question_text | widget | required | position |
|-------------|---------------|--------|----------|----------|
| int         | text          | int    | boolean  | int      |

第二个表称为factors_questions_relationship如下所示:

| factor_id   | question_id   |
|-------------|---------------|
| int         | text          |

我正在尝试创建将创建多行并返回新创建的条目的ID数组的函数。 如何正确发挥这种功能?

CREATE OR REPLACE FUNCTION factorio(
    FACTOR_IDENTIFIER INT,
    TEXT_ARR VARCHAR[],
    WIDGET_ARR INT[],
    REQUIRED_ARR BOOLEAN[],
    POSITION_ARR INT[]
) RETURNS SETOF INT AS $$
    BEGIN
        RETURN QUERY
        WITH RESULT_SET AS (
            INSERT INTO QUESTIONS (TEXT, WIDGET, REQUIRED, POSITION) 
            SELECT 
                UNNEST(ARRAY[TEXT_ARR]) AS TEXT,
                UNNEST(ARRAY[WIDGET_ARR]) AS WIDGET,
                UNNEST(ARRAY[REQUIRED_ARR]) AS REQUIRED,
                UNNEST(ARRAY[POSITION_ARR]) AS POSITION
            RETURNING ID
        )
        --
        INSERT INTO factors_questions_relationship (FACTOR_ID, QUESTION_ID) 
        SELECT FACTOR_IDENTIFIER FACTOR_ID, QUESTION_ID FROM UNNEST(ARRAY[array_agg(SELECT ID FROM RESULT_SET)]) QUESTION_ID
        --
        SELECT ID FROM RESULT_SET;
    END;
$$ LANGUAGE plpgsql;

您可以将它们嵌套在列中

select 
     unnest(array['quick','brown','fox']) as question_text, 
     unnest(array[1,2,3]) as widget_id

在此处输入图片说明

而将它们放在FROM子句中将导致笛卡尔积:

select question_text, widget_id
from 
unnest(array['quick','brown','fox']) as question_text, 
unnest(array[1,2,3]) as widget_id

输出:

在此处输入图片说明

要获取从新插入的记录生成的ID,请使用return query + returning id组合。 样品测试:

create table z
(
    id int generated by default as identity primary key, 
    question_text text
);

create or replace function insert_multiple_test()
returns table (someid int) as
$$
begin
    return query
    with resulting_rows as
    (
        insert into z(question_text) values
        ('hello'),
        ('你好'),
        ('hola')
        returning id
    )
    select id from resulting_rows;
end;
$$ language 'plpgsql';


select * from insert_multiple_test();

输出:

在此处输入图片说明

这是给SETOF的:

create table z(id int generated by default as identity primary key, question_text text);

create or replace function insert_multiple_test()
returns setof int
as           
$$   
begin
    return query 
    with resulting_rows as
    (
        insert into z(question_text) values
        ('hello'),
        ('你好'),
        ('hola')
        returning id
    )
    select id from resulting_rows;
end;
$$ language 'plpgsql';


select x.the_id from insert_multiple_test() as x(the_id);

输出:

在此处输入图片说明

如果您不需要运行多个查询,则可以使用LANGUAGE 'sql' ,它更简单:

create table z
(
    id int generated by default as identity primary key, 
    question_text text
);

create or replace function insert_multiple_test()
returns setof int as
$$
    insert into z(question_text) values
    ('hello'),
    ('你好'),
    ('hola')
    returning id;
$$ language 'sql';


select x.id_here from insert_multiple_test() as x(id_here);

输出:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM