我有一个INSERT
语句,它返回插入的ID:
INSERT INTO encyclopedias (page_id)
SELECT page.id FROM pages
RETURNING id;
INSERT INTO cookbooks (page_id)
SELECT page.id FROM pages
RETURNING id;
返回类似的内容:
id
----
1
2
id
----
3
4
解析输出时,我想知道ID来自哪个表,如:
encyclopedia id
----
1
2
cookbook id
----
3
4
或:
table, id
----
encyclopedias, 1
encyclopedias, 2
table, id
----
cookbooks, 3
cookbooks, 4
我该怎么做?
答案 0 :(得分:3)
有一个简单的解决方案可以使用系统列tableoid
自动执行此操作。
这是源表的内部OID(对象ID),可以强制转换为regclass
以将其转换为实际的表名。
INSERT INTO encyclopedias (page_id)
SELECT id FROM pages
RETURNING tableoid::regclass::text AS table, page_id AS id;
完全返回您想要的输出:
table | id
--------------+----
encyclopedias | 1
encyclopedias | 2
如果您更改FROM
子句中的表格(如示例中所示),则无需调整RETURNING
子句。
相关:
答案 1 :(得分:2)
在returning
子句中使用列别名和常量:
insert into t(x) values(1) returning x as xx, 'the table' as table_name;
╔════╤════════════╗
║ xx │ table_name ║
╠════╪════════════╣
║ 1 │ the table ║
╚════╧════════════╝
UPD:
此外,您可以为psql指定多种输出格式设置,例如:
$ echo "
> \pset format unaligned
> \pset tuples_only on
> \echo --==## foo ##==--
> select 1,2,3;" | psql
Output format is unaligned.
Tuples only is on.
--==## foo ##==--
1|2|3
在the documentation中查找更多内容。
答案 2 :(得分:0)
其中一种方法是使用WITH
查询:
WITH inserts AS (
INSERT INTO encyclopedias (page_id)
SELECT page.id FROM pages
RETURNING id
)
SELECT inserts.id AS encyclopedia_id;
或
WITH inserts AS (
INSERT INTO encyclopedias (page_id)
SELECT page.id FROM pages
RETURNING id
)
SELECT 'encyclopedia' AS "table", inserts.id AS "id";
的更多信息