AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 226810
Accepted
ThatDataGuy
ThatDataGuy
Asked: 2019-01-11 08:40:37 +0800 CST2019-01-11 08:40:37 +0800 CST 2019-01-11 08:40:37 +0800 CST

Retorna mais colunas do que as inseridas em uma CTE do PostgreSQL

  • 772

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
postgresql
  • 1 1 respostas
  • 1553 Views

1 respostas

  • Voted
  1. Best Answer
    McNets
    2019-01-11T11:35:34+08:002019-01-11T11:35:34+08:00

    De acordo com o Postgres Docs sobre 6.4. Retornando dados de linhas modificadas você não pode.

    Citado de documentos:

    Em um INSERT, os dados disponíveis para RETURNING são a linha como ela foi inserida . Isso não é tão útil em inserções triviais, pois apenas repetiria os dados fornecidos pelo cliente. Mas pode ser muito útil ao contar com valores padrão calculados. Por exemplo, ao usar uma coluna serial para fornecer identificadores exclusivos, RETURNING pode retornar o ID atribuído a uma nova linha.

    A menos que esses dados sejam atualizados por um gatilho:

    Se houver gatilhos (Capítulo 39) na tabela de destino, os dados disponíveis para RETURNING serão a linha modificada pelos gatilhos. Assim, inspecionar colunas computadas por gatilhos é outro caso de uso comum para RETURNING.

    Você pode verificar usandoRETURNING *

    CREATE TABLE t1 (id int, foo int);
    CREATE TABLE t2 (id int, bar int);
    
    INSERT INTO t2 VALUES (1, 2);
    
    INSERT INTO t1 (id, foo)
    SELECT id, bar
    FROM   t2
    WHERE  id = 1
    RETURNING *;
    
    identificação | foo
    -: | --:
     1 | 2
    

    db<>fique aqui

    Você pode obtê-lo usando um CTE aninhado:

    WITH x AS
    (
        SELECT * FROM t2 WHERE id = 1
    ), y AS
     (
        INSERT INTO t1 (id, foo)
        SELECT id, bar
        FROM   x
        RETURNING *
     )
     SELECT x.*, y.*
     FROM x, y;
    
    identificação | barra | identificação | foo
    -: | --: | -: | --:
     1 | 2 | 1 | 2
    

    db<>fique aqui

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve