问题:Postgres:如果不存在则添加约束

Postgres 有没有办法说ALTER TABLE foo ADD CONSTRAINT bar ...如果约束已经存在,它将忽略该命令,以便它不会引发错误?

解答

这可能会有所帮助,尽管它可能有点肮脏:

create or replace function create_constraint_if_not_exists (
    t_name text, c_name text, constraint_sql text
) 
returns void AS
$$
begin
    -- Look for our constraint
    if not exists (select constraint_name 
                   from information_schema.constraint_column_usage 
                   where table_name = t_name  and constraint_name = c_name) then
        execute constraint_sql;
    end if;
end;
$$ language 'plpgsql'

然后调用:

SELECT create_constraint_if_not_exists(
        'foo',
        'bar',
        'ALTER TABLE foo ADD CONSTRAINT bar CHECK (foobies < 100);')

更新:

根据下面的Webmut 的回答建议:

ALTER TABLE foo DROP CONSTRAINT IF EXISTS bar;
ALTER TABLE foo ADD CONSTRAINT bar ...;

这在您的开发数据库中可能没问题,或者您知道可以在维护窗口中关闭依赖此数据库的应用程序。

但是,如果这是一个活跃的任务关键型 24x7 生产环境,您真的不想像这样随意放弃约束。即使只有几毫秒,也有一个短暂的窗口,您不再执行约束,这可能会让错误的值溜走。这可能会产生意想不到的后果,在未来的某个时候导致相当大的业务成本。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐