【发布时间】:2018-04-16 16:06:12
【问题描述】:
我正在尝试 INSERT 一条记录,返回 ID,然后将 ID 传递给其他表并插入附加数据。插入的数据为JSON格式。
我正在使用函数调用来插入数据,虽然 create 语句有效,但在执行过程中我做错了(所以要么a)我没有正确编写语句,要么 b)我没有t 正确传递数据)。
我得到的错误是这样的:
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 行的 main_data 表、填充了 2 行的 locale_data 表和填充了 2 行的 demographic_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 语句写错了,但我不确定在从另一个操作返回ID 后如何处理JSON 的数据插入。
【问题讨论】:
-
jsonb_populate_recordset返回一个记录集。不是字符串 -
也许这对你有用stackoverflow.com/questions/27215216/…postgres 9.4+
标签: sql database postgresql insert plpgsql