【问题标题】:How to update multiple tables at the same time in Postgresql?如何在 Postgresql 中同时更新多个表?
【发布时间】:2019-12-05 16:15:27
【问题描述】:

所以我在一个数据库中有很多表,我想为它们添加两个新列。 例如,我有“created_at”和“modified_at”列,我想创建“client_created_at”和“client_modified_at”列 同时使用每个表的“created_at”和“modified_at”值填充这些新列。

我想象并尝试过这样的事情:

ALTER TABLE patients, folders, auscultations, auscultations_notes, folder_ausc_association
    ADD COLUMN client_created_at bigint, client_modified_at bigint;

UPDATE patients, folders, auscultations, auscultations_notes, folder_ausc_association
    SET client_created_at = created_at, client_modified_at = modified_at

我不确定如何构建它,任何帮助将不胜感激!

【问题讨论】:

  • 也许使用一些触发器。更新患者表时,必须更新文件夹,听诊等...
  • 任何关于如何做到这一点的例子?

标签: sql postgresql function sql-update alter-table


【解决方案1】:

除了来自 Laurenz Albe 的解决方案之外,您还可以创建一个 anonymous code block 来完成这项工作。当您有许多表并且不想为每个表创建一条语句时,这样的查询会非常方便。

DO $$
DECLARE
  row record;
BEGIN
    FOR row IN SELECT * FROM pg_tables WHERE schemaname = 'public' 
    LOOP
      EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' ADD COLUMN client_created_at bigint, ADD COLUMN client_modified_at bigint;';
      EXECUTE 'UPDATE ' || quote_ident(row.tablename) || ' SET client_created_at = created_at, client_modified_at = modified_at;';
    END LOOP;
END;
$$;

注意:此代码块将您想要的列添加到架构public 中的所有表 - 请谨慎使用!您可以通过在块中更改此查询来使其适应您需要的表:

SELECT * FROM pg_tables WHERE schemaname = 'public'

【讨论】:

    【解决方案2】:

    您必须为您的两个语句中的每一个使用每个表的语句。

    定义一个维护窗口,然后对每个表执行:

    ALTER TABLE patients
       ADD client_created_at bigint, client_modified_at bigint;
    
    UPDATE patients
       SET client_created_at = created_at, client_modified_at = modified_at;
    
    ALTER TABLE patients
       ALTER client_created_at SET NOT NULL,
       ALTER client_created_at DEFAULT extract(epoch FROM current_timestamp),
       ALTER client_modified_at SET NOT NULL,
       ALTER client_modified_at DEFAULT extract(epoch FROM current_timestamp);
    

    如果您有不同的需求,请使用不同的DEFAULT

    【讨论】:

    • 感谢您的帮助。有没有办法避免为每个表复制这个查询?我有很多...
    • @JimJones 的回答为此提供了帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多