簡體   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