所以我在数据库中有很多表,我想为它们添加两个新列。 例如,我有“ 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
我不确定如何组织它,任何帮助将不胜感激!
答案 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'