我想在我的数据库方案中为所有列名称
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
所有对象都应命名为唯一
在您的情况下,名称 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 $$;
限定不明确的名称
... SELECT columns.table_name FROM information_schema.columns ...