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 / 148858
Accepted
Chloe
Chloe
Asked: 2016-09-06 14:11:34 +0800 CST2016-09-06 14:11:34 +0800 CST 2016-09-06 14:11:34 +0800 CST

Como esta instrução atualizou 3 linhas no Postgres?

  • 772

Estou curioso para saber como esta declaração atualizou 3 linhas no Postgres. Todas as outras vezes que executei, ele atualizaria 0 ou 1. Existe uma maneira de descobrir quais linhas?

bestsales=# update keyword set revenue = random()*10 where id = cast(random()*99999 as int);
UPDATE 3

idé a chave primária.

 id               | integer                        | not null default nextval('keyword_id_seq'::regclass)
    "keyword_pkey" PRIMARY KEY, btree (id)

Eu tentei executá-lo como SELECT:

bestsales=# select * from keyword where id = cast(random()*99999 as int);
  id   |       keyword       | seed_id | source | search_count | country | language | volume | cpc  | competition | modified_on | google_violation | revenue | bing_violation
-------+---------------------+---------+--------+--------------+---------+----------+--------+------+-------------+-------------+------------------+---------+----------------
  6833 | vizio m190mv        |         | GOOGLE |            0 |         |          |     70 | 0.38 |        0.90 |             |                  |         |
 65765 | shiatsu massage mat |         | SPYFU  |            0 |         |          |    110 | 0.69 |             |             |                  |         |
 87998 | granary flour       |         | SPYFU  |            0 |         |          |     40 | 0.04 |             |             |                  |         |
(3 rows)

E às vezes retornava mais de um. Como isso é possível?

PostgreSQL 9.5.3

postgresql update
  • 2 2 respostas
  • 309 Views

2 respostas

  • Voted
  1. ypercubeᵀᴹ
    2016-09-06T14:35:30+08:002016-09-06T14:35:30+08:00

    Parece que random()é executado uma vez por linha e não uma vez por toda a instrução. Portanto, cada idvalor é verificado em relação a um valor aleatório diferente. Você pode obter 0, 1, 2 ou mais, até mesmo todas as linhas da tabela, embora essa possibilidade seja muito pequena mesmo com 10 linhas.

    Se você deseja que seja executado uma vez e assim obter apenas um valor e atualizar apenas zero ou uma linha, você pode usar um CTE, que é conhecido por ser avaliado antes da consulta principal:

    with rnd as
      ( select random() as random )               -- get just one value
    select * 
    from keyword, rnd 
    where id = cast(rnd.random * 99999 as int) ;  -- and use it everywhere
    

    e o mesmo para UPDATE:

    with rnd as
      ( select random() as random ) 
    update keyword
    set revenue = random()*10                    -- different random value
    from rnd 
    where id = cast(rnd.random * 99999 as int);
    
    • 5
  2. Best Answer
    Erwin Brandstetter
    2016-09-06T16:29:45+08:002016-09-06T16:29:45+08:00

    Mesmo uma subconsulta simples faz o trabalho:

    UPDATE keyword
    SET    revenue = random() * 10
    WHERE  id = (SELECT (random() * 99999)::int);
    

    A subconsulta é avaliada uma vez e apenas uma linha é atualizada (se o idvalor existir). Um pouco mais barato do que usar um CTE.

    Se você usar a expressão sem wrapper de subconsulta, random()é avaliada para cada linha, porque é uma função volátil . Isso ocorre por design e geralmente é o comportamento desejado.

    Quanto à sua pergunta adicional:

    Existe uma maneira de descobrir quais linhas?

    Não com segurança garantida, mas se você executar esta consulta imediatamente após o UPDATE, as linhas que compartilham o ID de transação mais alto em xminvalor são as atualizadas ou inseridas mais recentemente.

    Todas as linhas inseridas/atualizadas na mesma transação compartilham o mesmo ID da transação. Se você tiver várias INSERT/ UPDATEoperações na mesma tabela em uma transação, precisará examinar o ID do comando cminadicionalmente:

    SELECT *, xmin, cmin
    FROM   keyword
    ORDER  BY xmin::text::bigint DESC;
    

    Não há garantias porque xminestá sujeito a possível recuperação do ID da transação. Mas normalmente funciona.

    xmine cminsão colunas do sistema no cabeçalho da linha.
    O manual sobre tipos de identificador de objeto.

    Ainda na mesma transação (atualização ainda não confirmada), existe um método ainda mais seguro:

    • Como visualizar as tuplas alteradas em uma transação do PostgreSQL?

    • Como comparar xmin e txid_current () após o wraparound do ID das transações?

    Relacionado:

    • Posso selecionar dados inseridos na mesma transação não confirmada?
    • 5

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