Algo assim é possível?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
como usar o valor de retorno como valor para inserir uma linha em uma segunda tabela com uma referência à primeira tabela?
postgresql
sql-returning
Eike Cochu
fonte
fonte
rows
por(some_query returning ...)
pode funcionar hoje em dia (não tentei).A melhor prática para esta situação. Use
RETURNING … INTO
.INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
Observe que isso é para PLPGSQL
fonte
RETURNING ... INTO
.Em linha com a resposta dada por Denis de Bernardy ..
Se você deseja que o id seja retornado posteriormente também e deseja inserir mais coisas na Tabela 2:
with rows as ( INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id ) INSERT INTO Table2 (val, val2, val3) SELECT id, 'val2value', 'val3value' FROM rows RETURNING val
fonte
DO $$ DECLARE tableId integer; BEGIN INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId; INSERT INTO Table2 (val) VALUES (tableId); END $$;
Testado com psql (10.3, servidor 9.6.8)
fonte
Você pode usar a
lastval()
função:Então, algo assim:
INSERT INTO Table1 (name) VALUES ('a_title'); INSERT INTO Table2 (val) VALUES (lastval());
Isso funcionará bem, desde que ninguém chame
nextval()
em qualquer outra sequência (na sessão atual) entre seus INSERTs.Como Denis observou abaixo e eu avisei acima, usar
lastval()
pode causar problemas se outra sequência for acessada usandonextval()
entre seus INSERTs. Isso poderia acontecer se houvesse um gatilho INSERTTable1
chamado manualmentenextval()
em uma sequência ou, mais provavelmente, se houvesse um INSERT em uma tabela com uma chave primáriaSERIAL
ouBIGSERIAL
. Se você quiser ser realmente paranóico (uma coisa boa, eles realmente são você para te pegar, afinal), você poderia usar,currval()
mas você precisa saber o nome da sequência relevante:INSERT INTO Table1 (name) VALUES ('a_title'); INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
A sequência gerada automaticamente é geralmente nomeada
t_c_seq
ondet
é o nome da tabela ec
é o nome da coluna, mas você sempre pode descobrir entrandopsql
e dizendo:e, em seguida, olhar para o valor padrão da coluna em questão, por exemplo:
FYI:
lastval()
é, mais ou menos, a versão PostgreSQL do MySQLLAST_INSERT_ID
. Menciono isso apenas porque muitas pessoas estão mais familiarizadas com o MySQL do que com o PostgreSQL, portanto, vincularlastval()
a algo familiar pode esclarecer as coisas.fonte
lastval
é que pode haver um INSERT baseado em sequência nas suas costas de um gatilho AFTER INSERT na Tabela1. Isso seria na sessão atual e, provavelmente, mudarialastval()
quando você não estivesse esperando.INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id
fonte