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 / 156105
Accepted
Evan Carroll
Evan Carroll
Asked: 2016-11-23 20:20:05 +0800 CST2016-11-23 20:20:05 +0800 CST 2016-11-23 20:20:05 +0800 CST

CREATE TABLE AS vs SELECT INTO

  • 772

PostgreSQL suporta CREATE TABLE ASe SELECT INTOquando eu uso ambos?

CREATE TABLE AS-- define uma nova tabela a partir dos resultados de uma consulta

CREATE TABLE AScria uma tabela e a preenche com dados calculados por um SELECTcomando. As colunas da tabela têm os nomes e tipos de dados associados às colunas de saída do SELECT(exceto que você pode substituir os nomes das colunas fornecendo uma lista explícita de novos nomes de colunas).

CREATE TABLE AStem alguma semelhança com a criação de uma visão, mas é bem diferente: cria uma nova tabela e avalia a consulta apenas uma vez para preencher a nova tabela inicialmente. A nova tabela não rastreará alterações subsequentes nas tabelas de origem da consulta. Em contraste, uma visão reavalia sua SELECTdeclaração de definição sempre que é consultada.

E depois.

SELECT INTO-- define uma nova tabela a partir dos resultados de uma consulta

SELECT INTOcria uma nova tabela e a preenche com dados calculados por uma consulta. Os dados não são devolvidos ao cliente, como ocorre com um arquivo SELECT. As colunas da nova tabela têm os nomes e tipos de dados associados às colunas de saída do arquivo SELECT.

postgresql ctas
  • 2 2 respostas
  • 15531 Views

2 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2016-11-23T20:20:05+08:002016-11-23T20:20:05+08:00

    Sem a explicação, use sempre CREATE TABLE ASsem exceção. Na parte inferior de cada um em NOTAS , isso é esclarecido,

    Notas para SELECT INTO,

    CREATE TABLE ASé funcionalmente semelhante a SELECT INTO. CREATE TABLE ASé a sintaxe recomendada, já que esta forma de SELECT INTOnão está disponível em ECPG ou PL/pgSQL, pois eles interpretam a cláusula INTO de forma diferente. Além disso, CREATE TABLE ASoferece um superconjunto da funcionalidade fornecida pelo SELECT INTO.

    Notas para CREATE TABLE AS,

    Este comando é funcionalmente semelhante ao SELECT INTO, mas é preferível, pois é menos provável que seja confundido com outros usos da SELECT INTOsintaxe. Além disso, CREATE TABLE ASoferece um superconjunto da funcionalidade oferecida pelo SELECT INTO.

    Também na seção Compatibilidade dos documentos SELECT INTOvai ainda mais longe,

    O padrão SQL é usado SELECT INTOpara representar a seleção de valores em variáveis ​​escalares de um programa host, em vez de criar uma nova tabela. Este é, de fato, o uso encontrado em ECPG (consulte o Capítulo 34) e PL/pgSQL (consulte o Capítulo 41). O uso do PostgreSQL SELECT INTOpara representar a criação de tabelas é histórico. É melhor usar CREATE TABLE ASpara essa finalidade no novo código.

    Então nós temos,

    1. O PostgreSQL acha que é confuso porque SELECT INTOfaz outras coisas em contextos disponíveis apenas em PL/pgSQL e ECPG.
    2. CREATE TABLEsuporta mais funcionalidade (suponho que eles estejam se referindo a WITH OIDS, e TABLESPACE, IF NOT EXISTS).
    3. SELECT INTOpara criação de tabela é "obsoleto".

    Como observação, a sintaxe de um CTAS com um CTE pode parecer um pouco estranha. , e também SELECT INTO pode ser algum tipo de controle sobre QUEL'sRETRIEVE INTO . QUEL foi o predecessor do SQL, que o antecessor do PostgreSQL (INGRES) usava.

    • 23
  2. shrumm
    2019-06-15T15:49:11+08:002019-06-15T15:49:11+08:00

    Há outra coisa que notei que está faltando na resposta aceita. Usar CREATE TABLE ASpreserva o atributo anulável de cada coluna que parece ser ignorado por SELECT INTO.

    Apenas com base nisso, eu recomendo CREATE TABLE AS. Um caso de uso comum para ambas as instruções é carregar dados de uma consulta de execução longa em uma tabela sem bloquear essa tabela durante a consulta. Você cria uma tabela temporária usando um dos comandos acima, coloca os resultados da consulta de execução longa e, em seguida, insere esses resultados na tabela original. Preservar o atributo anulável em sua tabela temporária reduz as chances de sua segunda inserção falhar.

    Testado no PG 11, talvez um recurso mais recente desde que essa pergunta foi respondida.

    • 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