在INSERT语句的RETURNING中包含表名

时间:2016-11-01 20:56:57

标签: sql postgresql sql-returning

我有一个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

我该怎么做?

3 个答案:

答案 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";

有关PostgreSQL Documentation page about INSERT

的更多信息