Postgres:如果约束尚不存在,则添加约束

新手上路,请多包涵

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

原文由 Paul A Jungwirth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

 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 生产环境,您真的不想像这样随意放弃约束。即使只有几毫秒,也有一个短暂的窗口,您不再执行约束,这可能会让错误的值溜走。这可能会产生意想不到的后果,在未来的某个时候导致相当大的业务成本。

原文由 Kev 发布,翻译遵循 CC BY-SA 3.0 许可协议

对我来说,这些解决方案不起作用,因为约束是主键。这个对我有用:

 ALTER TABLE <table.name> DROP CONSTRAINT  IF EXISTS <constraint.name> CASCADE;

原文由 Jaime Torner 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进