レコードをINSERT
にしようとしていますが、IDを返してから別のテーブルにIDを渡し、追加データを挿入します。挿入するデータはJSON形式です。Postgresでレコードセットと返されたIDを取り込む機能
私はデータを挿入するために関数呼び出しを使用していますが、作成ステートメントが動作している間に、実行中に何か間違っています(そのために)か、文を正しく書かなかったかb)データを適切に渡す)。
私は取得していますエラーは、次のとおりです。ここで
ERROR: INSERT has more target columns than expressions
SQL state: 42601
Context: PL/pgSQL function insert_to_tables(jsonb,jsonb,jsonb) line 3 at SQL statement
は私のテーブルがどのように見えるかです:
CREATE TABLE main_data(
id SERIAL PRIMARY KEY,
field_1 TEXT,
some_time DATE
);
CREATE TABLE locale_data(
locale_id SERIAL PRIMARY KEY,
city TEXT,
state TEXT,
address TEXT,
main_data_id INTEGER REFERENCES main_data(id)
);
CREATE TABLE demographic_data(
demographic_id SERIAL PRIMARY KEY,
age INT,
ethnicity TEXT,
main_data_id INTEGER REFERENCES main_data(id)
);
私はデータ入力や解析を処理するために、そのような関数があります。
CREATE OR REPLACE FUNCTION insert_to_tables (
main_data_fields JSONB,
locale_data_fields JSONB,
demographic_data_fields JSONB,
OUT new_user_id INTEGER
)
RETURNS integer AS $$
BEGIN
WITH ins AS (
INSERT INTO main_data SELECT * FROM jsonb_populate_recordset(NULL::main_data, $1::jsonb)
RETURNING id
)
INSERT INTO locale_data(city, state, address, main_data_id)
SELECT i.id AS main_data_id, jsonb_populate_recordset(NULL::locale_data, $2::jsonb)
FROM ins i;
INSERT INTO demographic_data(age, ethnicity)
SELECT i.id AS main_data_id, jsonb_populate_recordset(NULL::demographic_data, $3::jsonb)
FROM ins i;
END;
$$ LANGUAGE plpgsql;
データを挿入するには、次のように関数を呼び出します。
select insert_to_tables(
'{"field_1": "http://www.google.com", "some_time": "09-02-2019"}',
'[{"city": "a city", "address": "123 fake road", "state": "CA"}, {"city": "little city", "address": "456 noname road", "state": "WA"}]',
'[{"age": 45, "ethnicity": "Asian"}, {"age": "45", "ethnicity": "Egyptian"}]'
);
私の予想出力は1行目、2行、2列を移入demographic_data
テーブル移入locale_data
テーブル移入main_data
テーブルであるべきです。
locale
とdemographic
テーブル内の行のそれぞれに属し、そのようmain_data
テーブルの行を参照する必要があります。
id | field1_1 | some_time |
----+-------------------------+------------+
1 | http://www.google.com | 09-02-2019
locale_id | city | state | address | main_data_id
-----------+----------------+---------+------------------+---------+
1 | a city | CA | 123 fake road | 1
2 | little city | WA | 456 noname road | 1
locale_id | age | ethnicity | main_data_id
-----------+-------------+----------------+------------------+
1 | 45 | Asian | 1
2 | 45 | Egyptian | 1
私はINSERT INTO
文の私の第二セットはmiswrittenされていることを推測するが、私は別の操作からIDを返した後にJSONのデータ挿入を処理する方法が不明です。
は 'レコードセットを返すjsonb_populate_recordset'。文字列でない –
これはあなたのために働くかもしれませんhttps://stackoverflow.com/questions/27215216/postgres-how-to-convert-json-string-to-text postgres 9.4+ –