admin

Postgres:添加约束(如果尚不存在)

sql

Postgres是否有任何办法说ALTER TABLE foo ADD CONSTRAINT bar ...如果约束已经存在,它将忽略该命令,从而不会引发错误?


阅读 148

收藏
2021-05-10

共1个答案

admin

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

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全天候生产环境,那么您真的不想像这样随意地放弃约束。即使是几毫秒,也有一小段窗口,您不再需要执行约束,这可能会导致错误值漏掉。这可能会带来意想不到的后果,从而在将来的某些时候导致可观的业务成本。

2021-05-10