问题描述
我有一个表 import.hugo
(导入是架构),我需要将所有列的数据类型从 text
更改为 numeric
。该表已经有数据,因此要更改列(例如)y
我使用这个:
ALTER TABLE import.hugo ALTER COLUMN y TYPE numeric USING (y::numeric);
但是表格有很多列,我不想手动完成。 我找到了一些东西 here 并像这样尝试:
do $$
declare
t record;
begin
for t IN select column_name,table_name
from information_schema.columns
where table_name='hugo' AND data_type='text'
loop
execute 'alter table ' || t.table_name || ' alter column ' || t.column_name || ' type numeric';
end loop;
end$$;
当我运行它时,它不起作用,它说:relation "hugo" does not exist
我尝试了此代码的更多变体,但无法使其正常工作。
我也不知道如何实现这部分:USING (y::numeric);
(从第一个命令开始)到这个命令中。
理想情况下,我需要在一个函数中使用它,用户可以在其中定义表的名称,我们在其中更改列数据类型。所以函数调用这样SELECT function_name(table_name_to_alter_columns);
谢谢。
解决方法
从 table_name
中选择 information_schema.columns
是不够的,因为 import
架构不在您的 search path
中。您可以通过将 import
附加到 search_path
中显示的任何内容,将 import
架构添加到您的 SHOW search_path
,或者您可以将 table_schema
列添加到您的 { {1}} 块:
DO