【问题标题】:Postgres: Update all columns from another tablePostgres:更新另一个表中的所有列
【发布时间】:2014-04-24 20:19:06
【问题描述】:

我需要从另一个表更新一个表,并且我需要更新所有列,我的问题是,除了列出 SET 中的每一列之外,有没有办法像这样更新它们:

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

我在 psql 中尝试过,它不起作用.. 我必须像这样列出每一列:

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

tableB 是使用 create..like tableA 创建的。所以它们基本上是相同的。我这样做的原因是我需要将.csv数据加载到临时表tableB,然后根据tableB中的新数据更新tableA。 tableA 需要尽可能少地被锁定,并且 tableA 需要保持完整性。我不确定“删除然后插入”是否是一个不错的选择?

谢谢!

【问题讨论】:

    标签: sql postgresql psql


    【解决方案1】:

    如果两个表的列顺序相同,您可以删除并重新插入。假设tableB中的所有记录都匹配tableA:

    delete from tableA
        where id in (select id from tableB)
    
    insert into tableA
        select *
        from tableB;
    

    (如果所有记录都不匹配,您可以使用临时表来保留必要的 id。)

    一般来说,我反对在没有列列表的情况下做insert。在某些情况下,这是可以容忍的——例如当tableB 是使用* 从tableB 创建的子集时。

    【讨论】:

    • 感谢@Gordon Linoff,实际上 tableB 是使用 create..like tableA 创建的。所以它们基本上是相同的。我这样做的原因是我需要将.csv数据加载到临时表tableB,然后根据tableB中的新数据更新tableA。 tableA 需要尽可能少地被锁定,并且 tableA 需要保持完整性。我不确定删除会是一个好的选择吗?谢谢!
    • @odieatla 。 . .您的评论添加了原始问题中没有的一大堆要求。您可能会考虑问另一个问题,对您想要做什么进行更详细的解释。这个问题似乎是关于不在查询中输入大量列名的肤浅愿望,而不是关于避免锁定的最佳方法的更深层次的问题。顺便说一句,后续问题可能更适合 dba.stackexchange.com,而不是本网站。
    • 感谢您的指导!我也会在那里发布并更新我的问题。
    • @odieatla 。 . .作为注释。当然,您可以更新问题。这是你的。但如果你这样做,你可能会使我的答案无效或让它看起来很愚蠢(事实上,这只是我对另一个问题的答案的一部分)。这可能会吸引对此答案的反对票,这对我(或任何其他试图回答这个问题的人)来说“不好”。您正在寻找的不是对这个问题的微小改变或澄清(在我看来)。
    【解决方案2】:

    取决于您的用例,并会导致锁定,但类型不同。适用于某些场景的方法。

    BEGIN;
        DROP TABLE IF EXISTS tableA_old;
        ALTER tableA RENAME TO tableA_old;
        ALTER tableB RENAME TO tableA;
    COMMIT;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 2021-07-27
      • 2011-04-18
      • 2023-03-10
      • 2022-01-23
      相关资源
      最近更新 更多