如何在 Postgresql 中同时更新多个表?

How to update multiple tables at the same time in Postgresql?

所以我在数据库中有很多 table,我想为它们添加两个新列。 例如,我有 "created_at" 和 "modified_at" 列,我想创建 "client_created_at" 和 "client_modified_at" 列 并同时用每个 table.

的 "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

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

你必须为你的两个语句中的每一个使用一个语句table。

定义一个维护window,然后为每个table执行:

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

除了 Laurenz Albe 的解决方案之外,您还可以创建一个 anonymous code block 来完成这项工作。当您有很多 table 并且不想为每个 table.

创建一个语句时,这样的查询会非常方便
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 中的 all tables - 请小心使用!您可以通过更改块中的此查询来使其适应您需要的 tables:

SELECT * FROM pg_tables WHERE schemaname = 'public'