如何在Postgres中的一个查询中更新所有表中同名的所有列的类型?

问题描述 投票:0回答:2

我想在我的数据库方案中为所有列名称

timestamp without timezone
分配类型
created_at
。我正在尝试运行此查询:

DO $$
DECLARE
  table_name text;
BEGIN
  FOR table_name IN SELECT table_name FROM information_schema.columns WHERE column_name = 'created_at' AND table_schema = 'public' LOOP
    EXECUTE 'ALTER TABLE ' || table_name || ' ALTER COLUMN created_at TYPE timestamp without time zone;';
  END LOOP;
END $$;

但我收到此错误:

ERROR:  column reference "table_name" is ambiguous
LINE 1: SELECT table_name FROM information_schema.columns WHERE colu...
               ^
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.
QUERY:  SELECT table_name FROM information_schema.columns WHERE column_name = 'created_at' AND table_schema = 'public'
CONTEXT:  PL/pgSQL function inline_code_block line 5 at FOR over SELECT rows
SQL state: 42702
sql postgresql plpgsql information-schema
2个回答
2
投票

所有对象都应命名为唯一

在您的情况下,名称 table_name 是信息模式的一部分,作为变量的名称

所以重写它像这样

DO $$
DECLARE
  p_table_name text;
BEGIN
  FOR p_table_name IN SELECT table_name FROM information_schema.columns WHERE column_name = 'created_at' AND table_schema = 'public' LOOP
    EXECUTE 'ALTER TABLE ' || p_table_name || ' ALTER COLUMN created_at TYPE timestamp without time zone;';
  END LOOP;
END $$;

1
投票

限定不明确的名称

...  SELECT columns.table_name FROM information_schema.columns ...
© www.soinside.com 2019 - 2024. All rights reserved.