如何在 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'
所以我在数据库中有很多 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'