Eu gostaria de usar um CTE de modificação para inserir alguns valores. A instrução insert insere dados de uma instrução select. Eu uso a palavra-chave de retorno para retornar os valores inseridos (incluindo colunas de incremento automático). No entanto, também quero que o CTE retorne outras colunas. Como posso fazer isso?
Segue um exemplo:
drop table if exists customers;
CREATE TABLE customers (
customer_id serial PRIMARY KEY,
name VARCHAR UNIQUE,
email VARCHAR NOT NULL,
active bool NOT NULL DEFAULT TRUE
);
INSERT INTO customers (NAME, email)
VALUES
('IBM', '[email protected]'),
(
'Microsoft',
'[email protected]'
),
(
'Intel',
'[email protected]'
);
drop table if exists customers2;
CREATE TABLE customers2 (
customer_id serial PRIMARY KEY,
name VARCHAR UNIQUE,
email VARCHAR NOT NULL
);
with x as (
INSERT INTO customers2 (NAME, email)
select name, email from customers
returning customer_id, name, email, active
)
select * from x
;
Gostaria que a última instrução retornasse as colunas customer_id, name, email, active. Mas recebo um erro:
Error: ERROR: column "active" does not exist
Position: 123
SQLState: 42703
ErrorCode: 0
Error occurred in:
with x as (
INSERT INTO customers2 (NAME, email)
select name, email from customers
returning customer_id, name, email, active
)
select * from x
De acordo com o Postgres Docs sobre 6.4. Retornando dados de linhas modificadas você não pode.
Citado de documentos:
A menos que esses dados sejam atualizados por um gatilho:
Você pode verificar usando
RETURNING *
db<>fique aqui
Você pode obtê-lo usando um CTE aninhado:
db<>fique aqui