问题很简单。如何添加列x到表y,但只有当x列不存在?我发现唯一的解决方案在这里如何检查列是否存在。
SELECT column_name
FROM information_schema.columns
WHERE table_name='x' and column_name='y';
问题很简单。如何添加列x到表y,但只有当x列不存在?我发现唯一的解决方案在这里如何检查列是否存在。
SELECT column_name
FROM information_schema.columns
WHERE table_name='x' and column_name='y';
当前回答
你可以这样做。
ALTER TABLE tableName drop column if exists columnName;
ALTER TABLE tableName ADD COLUMN columnName character varying(8);
因此,如果该列已经存在,它将删除该列。然后将列添加到特定的表中。
其他回答
下面的函数将检查列是否存在,如果返回适当的消息,否则它将把列添加到表中。
create or replace function addcol(schemaname varchar, tablename varchar, colname varchar, coltype varchar)
returns varchar
language 'plpgsql'
as
$$
declare
col_name varchar ;
begin
execute 'select column_name from information_schema.columns where table_schema = ' ||
quote_literal(schemaname)||' and table_name='|| quote_literal(tablename) || ' and column_name= '|| quote_literal(colname)
into col_name ;
raise info ' the val : % ', col_name;
if(col_name is null ) then
col_name := colname;
execute 'alter table ' ||schemaname|| '.'|| tablename || ' add column '|| colname || ' ' || coltype;
else
col_name := colname ||' Already exist';
end if;
return col_name;
end;
$$
在Postgres 9.6中,如果这个选项不存在,可以使用它来实现
ALTER TABLE table_name ADD COLUMN IF NOT EXISTS column_name INTEGER;
只需检查查询是否返回了一个column_name。
如果不是,执行如下命令:
ALTER TABLE x ADD COLUMN y int;
你把一些有用的东西放在x和y上,当然还有一个合适的数据类型,我用的是int。
对于那些使用Postgre 9.5+的人(我相信你们大多数人都在使用),有一个非常简单和干净的解决方案
ALTER TABLE if exists <tablename> add if not exists <columnname> <columntype>
可以添加到迁移脚本调用函数,并在完成时删除。
create or replace function patch_column() returns void as
$$
begin
if exists (
select * from information_schema.columns
where table_name='my_table'
and column_name='missing_col'
)
then
raise notice 'missing_col already exists';
else
alter table my_table
add column missing_col varchar;
end if;
end;
$$ language plpgsql;
select patch_column();
drop function if exists patch_column();