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

时间:2019-12-05 16:15:27

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

所以我在数据库中有很多表,我想为它们添加两个新列。 例如,我有“ 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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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'