2016-11-01 2 views
2

J'ai une déclaration INSERT comme pour que renvoie les ID insérés:Inclure le nom table revenions d'instruction INSERT

INSERT INTO encyclopedias (page_id) 
SELECT page.id FROM pages 
RETURNING id; 

INSERT INTO cookbooks (page_id) 
SELECT page.id FROM pages 
RETURNING id; 

qui retourne quelque chose comme:

id 
---- 
1 
2 

id 
---- 
3 
4 

Lors de l'analyse de la sortie, je d aiment dire de quelle table proviennent les ID, comme:

encyclopedia id 
---- 
1 
2 

cookbook id 
---- 
3 
4 

ou:

table, id 
---- 
encyclopedias, 1 
encyclopedias, 2 

table, id 
---- 
cookbooks, 3 
cookbooks, 4 

Comment est-ce que je ferais cela?

Répondre

3

Il existe une solution simple pour automatiser cela en utilisant la colonne système tableoid.

C'est l'OID interne (ID d'objet) de la table source, qui peut être converti en regclass pour le convertir en nom de table réel.

INSERT INTO encyclopedias (page_id) 
SELECT id FROM pages 
RETURNING tableoid::regclass::text AS table, page_id AS id; 

Renvoie votre sortie désirée exactement:

table   | id 
--------------+---- 
encyclopedias | 1 
encyclopedias | 2 

Si vous modifiez la table dans la clause FROM (comme dans votre exemple), vous n'avez pas besoin d'adapter la clause RETURNING.

connexes:

0

L'une des façons de le faire est à l'aide des WITH requêtes:

WITH inserts AS (
INSERT INTO encyclopedias (page_id) 
SELECT page.id FROM pages 
RETURNING id 
) 
SELECT inserts.id AS encyclopedia_id; 

ou

WITH inserts AS (
INSERT INTO encyclopedias (page_id) 
SELECT page.id FROM pages 
RETURNING id 
) 
SELECT 'encyclopedia' AS "table", inserts.id AS "id"; 

Plus d'informations sur les PostgreSQL Documentation page about INSERT

+1

C'est sournoise coller une insertion dans un CTE comme ça. Très agréable! – JNevill

+0

@JNevill: Un CTE n'aide pas ici. Cela ne fait que rendre la requête plus coûteuse et compliquée. –

2

Utilisez des alias de colonne et constantes dans le returning clause:

insert into t(x) values(1) returning x as xx, 'the table' as table_name; 
╔════╤════════════╗ 
║ xx │ table_name ║ 
╠════╪════════════╣ 
║ 1 │ the table ║ 
╚════╧════════════╝ 

Upd:

vous pouvez en plus de spécifier plusieurs paramètres de format de sortie pour le psql, par exemple:

$ 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 

Trouver plus the documentation.